Як отримати Url Hash (#) з боку сервера


133

Я знаю, що на стороні клієнта (javascript) ви можете використовувати windows.location.hash, але все-таки не змогли знайти доступ з боку сервера.


Ви знайшли спосіб вирішити цю проблему, у мене є закладки з URL-адресою і хочете отримати доступ до тексту після хешу на стороні сервера?
dotnetcoder

Відповіді пояснюють, що цього немає на сервері, оскільки інтерпретується лише користувальницьким агентом. Я намагався змінити активну вкладку, що я намагався зробити це на стороні сервера. Я натомість зробив це на стороні клієнта.
Рікі Супіт

Відповіді:


134

У нас виникла ситуація, коли нам потрібно було зберігати хеш URL-адрес у всіх спинках публікацій ASP.Net. Оскільки браузер не надсилає хеш на сервер за замовчуванням, єдиний спосіб зробити це - використовувати деякий Javascript:

  1. Коли форма подає, візьміть хеш ( window.location.hash) та збережіть його у прихованому вхідному полі на стороні сервера Помістіть це у DIV з ідентифікатором " urlhash", щоб ми могли його легко знайти пізніше.

  2. На сервері ви можете використовувати це значення, якщо вам потрібно щось зробити з ним. Ви навіть можете змінити це, якщо вам потрібно.

  3. На завантаженні сторінки на клієнта перевірте значення цього прихованого поля. Ви захочете знайти його за допомогою DIV, в якому він міститься, оскільки автоматично згенерований ідентифікатор не буде відомий. Так, ви можете зробити деякі хитрощі тут .ClientID, але ми виявили, що простіше використовувати оболонку DIV, оскільки це дозволяє всім Javascript жити у зовнішньому файлі та використовуватись загальним чином.

  4. Якщо поле прихованого введення має дійсне значення, встановіть його як хеш URL-адреси ( window.location.hash again) та / або виконайте інші дії.

Ми використовували jQuery для спрощення вибору поля і т. Д. ... в цілому це закінчується кількома дзвінками jQuery, один для збереження значення, а інший для відновлення.

Перед поданням:

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

На завантаженні сторінки:

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid()може перевірити " undefined" чи інші речі, з якими ви не хочете працювати.

Крім того, переконайтеся, що ви використовуєте $(document).ready()належним чином, звичайно.


4
Прекрасне рішення, але що про GET-запит?
Warlock

2
@Chris - Але як називається подія для надсилання форми, коли ви просто вставляєте URL-адресу в інший веб-переглядач (адже це просто GET-запит)?
KrishPrabakar

@Warlock, незалежно від get / post, воно буде працювати, оскільки ви зберігаєте хеш у прихованому полі.
KMX

83

RFC 2396, розділ 4.1:

Коли посилання URI використовується для виконання пошукової дії на ідентифікованому ресурсі, необов'язковий ідентифікатор фрагмента, відокремлений від URI символом перехресної передачі ("#"), складається з додаткової довідкової інформації, яка повинна бути інтерпретована користувальницьким агентом після отримання. дія успішно завершена . Як такий, він не є частиною URI, але часто використовується спільно з URI.

(наголос додано)


3
Я здивований. Я багато читав про SPA і не знав цього. Тож браузер надсилає стільки чутливої ​​інформації, але не хеш ?? Я думаю, що це має стати в майбутньому .. принаймні як окремий заголовок HTTP. З цим пов’язано: onebigfluke.com/2015/01/…
бодрін


7

Можливо, єдиний вибір - це прочитати його на стороні клієнта та перенести його вручну на сервер (GET / POST / AJAX). З повагою Артур

Ви також можете побачити, як грати з кнопкою "Назад" та історією браузера на "Малькан"


3

Просто, щоб виключити можливість, ви насправді не намагаєтеся побачити фрагмент на GET / POST, а насправді хочете знати, як отримати доступ до тієї частини об’єкта URI, який є у вас на коді на сервері, він знаходиться під Uri.Fragment ( Документи MSDN ).


8
IE8, Chrome і Firefox все не надсилають хеш на сервер; Отже, Uri.Fragment - це завжди порожній рядок, якщо вивчити сервер Request.Url.Fragment (відповідно до відповідей вище)
zcrar70

0

Можливе рішення для GET-запитів:

Новий формат посилання: http://example.com/yourDirectory?hash=video01

Викликайте цю функцію по відношенню до верхньої частини контролера або http://example.com/yourDirectory/index.php:

function redirect()
{
    if (!empty($_GET['hash'])) {
        /** Sanitize & Validate $_GET['hash']
               If valid return string
               If invalid: return empty or false
        ******************************************************/
        $validHash = sanitizeAndValidateHashFunction($_GET['hash']);
        if (!empty($validHash)) {
            $url = './#' . $validHash;
        } else {
            $url = '/your404page.php';
        }
        header("Location: $url");
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.