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

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

У вас есть способ обойти эту проблему, у меня есть закладки, в URL-адресе которых есть, и я хочу получить доступ к тексту после хеша на стороне сервера?

dotnetcoder 26.02.2009 13:21

Ответы объясняют, что это не работает на сервере, потому что интерпретируется только пользовательским агентом. Я пытался изменить активную вкладку, что пытался сделать на стороне сервера. Вместо этого я сделал это на стороне клиента.

Ricky Supit 02.03.2009 19:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
136
3
107 879
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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/…

bodrin 12.02.2015 20:42

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

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

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

IE8, Chrome и Firefox не будут отправлять хэш на сервер; Итак, Uri.Fragment всегда является пустой строкой, если вы исследуете Request.Url.Fragment на стороне сервера (согласно ответам выше).

zcrar70 03.05.2011 22:50
Ответ принят как подходящий

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

Отличное решение, но как насчет запроса GET?

Warlock 01.06.2013 19:57

@Chris - Но как вызывается событие отправки формы, когда вы просто вставляете URL-адрес в другой браузер (потому что это просто запрос GET)?

KrishPrabakar 15.07.2013 13:22

@Warlock, независимо от получения / публикации, он будет работать, поскольку вы храните хеш в скрытом поле.

KMX 14.01.2015 06:45

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

Другие вопросы по теме