Почему хэш-часть URL-адреса отсутствует на стороне сервера?

Например, если я набираю URL-адрес:

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

На сервере не входит: #MOREURL

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

благодаря

Related of "Почему хэш-часть URL-адреса отсутствует на стороне сервера?"

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

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

Вот что говорит об этом Wikipedia :

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

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

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

Поскольку браузер не отправляет хэш на сервер по умолчанию, единственный способ сделать это – использовать 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 ().

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

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

URI уникально указывает ресурс, извлеченный с сервера

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

ФРАГМЕНТ контролирует поведение браузера (приложения). Фрагмент должен использоваться для хранения состояния приложения, которое должно быть видимым для пользователя, чтобы пользователь мог отправить ссылку другому пользователю для получения того же состояния приложения.

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