Я знаю, что на стороне клиента (javascript) вы можете использовать windows.location.hash, но все равно не смогли найти доступ со стороны сервера.
Ответы объясняют, что это не работает на сервере, потому что интерпретируется только пользовательским агентом. Я пытался изменить активную вкладку, что пытался сделать на стороне сервера. Вместо этого я сделал это на стороне клиента.
Возможный дубликат Могу ли я прочитать хеш-часть URL-адреса в моем серверном приложении (PHP, Ruby, Python и т. д.)?





Это потому, что браузер не передает эту часть на сервер, извините.
RFC 2396 раздел 4.1:
When a URI reference is used to perform a retrieval action on the identified resource, the optional fragment identifier, separated from the URI by a crosshatch ("#") character, consists of additional reference information to be interpreted by the user agent after the retrieval action has been successfully completed. As such, it is not part of a URI, but is often used in conjunction with a URI.
(курсив добавлен)
Я удивлен. Я много читал о СПА и не знал об этом. Значит, браузер отправляет так много конфиденциальной информации, но не хеш? Я думаю, это должно произойти в будущем .. по крайней мере, как отдельный HTTP-заголовок. Это связано: onebigfluke.com/2015/01/…
Вероятно, единственный вариант - прочитать его на стороне клиента и вручную передать на сервер (GET / POST / AJAX). С уважением Артур
Вы также можете увидеть, как играть с помощью кнопки «Назад» и истории браузера. на Малькане
Чтобы исключить возможность того, что вы на самом деле не пытаетесь увидеть фрагмент в GET / POST и действительно хотите знать, как получить доступ к той части объекта URI, который у вас есть в коде на стороне сервера, он находится в Uri.Fragment (Документы MSDN).
IE8, Chrome и Firefox не будут отправлять хэш на сервер; Итак, Uri.Fragment всегда является пустой строкой, если вы исследуете Request.Url.Fragment на стороне сервера (согласно ответам выше).
У нас была ситуация, когда нам нужно было сохранить хэш 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().
Отличное решение, но как насчет запроса GET?
@Chris - Но как вызывается событие отправки формы, когда вы просто вставляете URL-адрес в другой браузер (потому что это просто запрос GET)?
@Warlock, независимо от получения / публикации, он будет работать, поскольку вы храните хеш в скрытом поле.
Возможное решение для запросов 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");
}
}
У вас есть способ обойти эту проблему, у меня есть закладки, в URL-адресе которых есть, и я хочу получить доступ к тексту после хеша на стороне сервера?