Как получить Url Hash (#) со стороны сервера

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

Ответ 1

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

  • Когда форма отправляется, возьмите хэш (window.location.hash) и сохраните его в скрытом поле ввода на стороне сервера. Поместите это в DIV с идентификатором "urlhash", чтобы мы могли легко найти его позже.

  • На сервере вы можете использовать это значение, если вам нужно что-то сделать с ним. Вы даже можете изменить его, если вам нужно.

  • На странице на клиенте проверьте значение этого скрытого поля. Вы захотите найти его в DIV, в котором он содержится, поскольку автогенерированный идентификатор не будет известен. Да, вы могли бы сделать некоторые хитрости здесь с .ClientID, но нам было проще просто использовать оболочку DIV, поскольку она позволяет всему этому Javascript жить во внешнем файле и использоваться в общем виде.

  • Если скрытое поле ввода имеет допустимое значение, установите его как хэш 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() соответственно, конечно.

Ответ 2

RFC 2396 раздел 4.1:

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

(выделено курсивом)

Ответ 3

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

Ответ 4

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

Вы также можете увидеть, как играть с помощью кнопки "Назад" и истории браузера в Malcan

Ответ 5

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

Ответ 6

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