Как получить Url Hash (#) со стороны сервера - PullRequest
128 голосов
/ 25 ноября 2008

Я знаю, что на стороне клиента (javascript) вы можете использовать windows.location.hash, но все равно не можете найти доступ со стороны сервера.

Ответы [ 6 ]

131 голосов
/ 19 октября 2009

У нас была ситуация, когда нам нужно было сохранить хэш 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() надлежащим образом, конечно.

78 голосов
/ 25 ноября 2008

RFC 2396 раздел 4.1:

Когда ссылка URI используется для выполнения действия поиска на идентифицированный ресурс, необязательный идентификатор фрагмента, отделенный от URI символом перекрестной штриховки ("#"), состоит из дополнительных справочная информация для интерпретации пользовательским агентом после Операция поиска была успешно завершена . Как таковой, это не часть URI, но часто используется вместе с URI.

(выделение добавлено)

41 голосов
/ 25 ноября 2008

Это потому, что браузер не передает эту часть на сервер, извините.

7 голосов
/ 30 декабря 2008

Вероятно, единственный выбор - прочитать его на стороне клиента и передать вручную на сервер (GET / POST / AJAX). С уважением Артур

Вы также можете посмотреть, как играть с помощью кнопки «Назад» и истории браузера. в Малкане

3 голосов
/ 30 декабря 2008

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

0 голосов
/ 10 марта 2016

Возможное решение для запросов 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");
    }
}
...