Подтвердить что ты не робот

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

Например, если я введу URL-адрес:

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

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

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

4b9b3361

Ответ 1

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

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

Здесь Wikipedia говорит об этом:

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

Хеш-компонент не передается на сервер, но он широко используется на стороне клиента. В частности, в одностраничных приложениях текст, следующий за хешем, используется для представления состояния приложения в виде различных маршрутов. Таким образом, происходит следующее: после первоначального запроса к серверу, который обслуживает "домашнюю" страницу вместе с дополнительными js файлами, которые включают логику маршрутизации на стороне клиента, такую как маршрутизатор, всякий раз, когда пользователь перемещается в любое место на странице, щелкая тег привязки изменяется только часть URL-адреса, следующая за хеш-компонентом. Это предотвращает запрос GET к серверу, и в ответ на это событие "onhashchange" содержимое одностраничного приложения может обновляться в зависимости от точного маршрута.