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

133

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

Рикки Супит
источник
у вас есть способ обойти эту проблему, у меня есть закладки с имеет в URL и хочу получить доступ к тексту после хэша на стороне сервера?
dotnetcoder
Ответы объясняют, что это не доступно на сервере, потому что интерпретируется только пользовательским агентом. Я пытался изменить активную вкладку, что я пытался сделать это на стороне сервера. Я закончил тем, что делал это на стороне клиента вместо этого.
Рикки Супит

Ответы:

134

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

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

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

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

  4. Если скрытое поле ввода имеет допустимое значение, установите его в качестве URL-адреса hash ( 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?
Чернокнижник
2
@Chris - Но как вызывается событие отправки формы, когда вы просто вставляете URL в другой браузер (потому что это всего лишь запрос GET)?
KrishPrabakar
@Warlock, независимо от get / post, он будет работать, так как вы храните хеш в скрытом поле.
KMX
83

RFC 2396 раздел 4.1:

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

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

Маурисио Шеффер
источник
3
Я удивлен. Я много читал о СПА и не знал этого. Таким образом, браузер отправляет столько конфиденциальной информации, но не хэш ?? Я думаю, что это должно произойти в будущем .. по крайней мере, как отдельный заголовок HTTP. Это связано: onebigfluke.com/2015/01/… ..
bodrin
42

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

Жюльен Остер
источник
7

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

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


источник
3

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

Patridge
источник
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");
    }
}
webaholik
источник