Почему хеш-часть URL недоступна на стороне сервера? - PullRequest
32 голосов
/ 08 сентября 2010

Например, если я наберу URL:

http://www.foo.com/page.php?parameter=kickme#MOREURL

Тогда на сервере нет части: # MOREURL

Можно ли отправить или получить эти части на сервер без jQuery AJAX?.

Ответы [ 4 ]

42 голосов
/ 08 сентября 2010

Нет, он доступен только для браузера , поэтому вам придется иметь дело с Javascript. Сервер не может прочитать это.

Пояснение:
В основном хеш-компонент URL страницы (часть, следующая за знаком #) обрабатывается только браузером - браузер никогда не передает его на сервер. К сожалению, это является частью стандарта HTML и одинаково, независимо от того, используете ли вы IE или любой другой браузер (и в этом отношении PHP или любую другую технологию на стороне сервера).

Вот что Википедия говорит об этом:

Идентификатор фрагмента функционирует иначе, чем остальная часть URI: а именно, его обработка исключительно на стороне клиента без участия сервера . Когда агент (например, веб-браузер) запрашивает ресурс с веб-сервера, агент отправляет URI на сервер, но не отправляет фрагмент. Вместо этого агент ожидает от сервера отправки ресурса, а затем агент обрабатывает ресурс в соответствии со значением фрагмента. В наиболее распространенном случае агент прокручивает веб-страницу до элемента привязки, строка атрибута которого равна значению фрагмента. Возможно другое поведение клиента

8 голосов
/ 08 сентября 2010

http://tools.ietf.org/html/rfc2396#section-4

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

4 голосов
/ 11 марта 2017

Хотелось бы расширить ответ по причине ПОЧЕМУ фрагмент не отправлен на сервер. Потому что это намеренное и желаемое поведение. Давайте посмотрим на строку URL в целом.

/path/to/element?query=string&for=server#?optional=fragment&for=browser <----- URI ----> <---- QUERY STRING ---> <----- FRAGMENT STRING ------>

URI однозначно указывает ресурс, выбранный с сервера

QUERY определяет операции, которые должны выполняться сервером на ресурсе

FRAGMENT контролирует поведение браузера (приложения). Фрагмент должен быть использован для сохранить состояние приложения, которое должно быть видно пользователю, чтобы пользователь мог отправить ссылку другому пользователю, чтобы получить то же состояние приложения.

Фрагмент - это единственная часть URL-адреса, которая бесплатна для прозрачной реализации одностраничных веб-приложений (например, которые могут работать автономно на вашем мобильном телефоне). Поэтому его нельзя отправлять на сервер.

4 голосов
/ 20 апреля 2013

Поскольку браузер не отправляет хэш на сервер по умолчанию, единственный способ сделать это - использовать Javascript:

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

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

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

  4. Если скрытое поле ввода имеет допустимое значение, установите его в качестве хэша URL-адреса (снова window.locaion.hash) и / или выполните другие действия.

Мы использовали jQuery, чтобы упростить выбор поля и т. Д. ... в итоге получилось несколько вызовов jQuery, один для сохранения значения, а другой для его восстановления.

Перед отправкой:

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

На странице загрузки:

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid () может проверять наличие «неопределенных» или других вещей, которые вы не хотите обрабатывать.

Кроме того, убедитесь, что вы используете $ (document) .ready (), соответственно.

...