Фрагмент URL и 302 перенаправления

Известно что фрагмент URL (часть после #) не отправляется на сервер.

Я действительно задаюсь вопросом хотя, как фрагменты работают когда перенаправление сервера (через состояние HTTP 302 и Location: заголовок), включен.

Мой вопрос является действительно двукратным:

  1. Если исходный URL имел фрагмент (/original.php#foo), и перенаправление сделано /new.php, часть фрагмента исходного URL просто теряются? Или это иногда становится относившимся новый URL?
    Будет новый URL когда-либо быть /new.php#foo в этом случае?

  2. Независимо от исходного URL, если сервер перенаправляет к новому URL с фрагментом (/new.php#foo), фрагмент будут "соблюдать"? Или делает сервер, действительно не имеют никакого бизнеса, вмешивающегося во фрагмент вообще - и будет браузер поэтому игнорировать его путем простого движения в /new.php??

130
задан levik 1 June 2017 в 12:03
поделиться

1 ответ

Update 2014-Jun-27:

RFC 7231, Протокол передачи гипертекста (HTTP/1.1): Семантика и содержание, был опубликован как ПРЕДЛАГАЕМЫЙ СТАНДАРТ. Из Changelog:

Синтаксис поля заголовка Location был изменен, чтобы разрешить все ссылки на URI, включая относительные ссылки. ссылки URI, включая относительные ссылки и фрагменты, а также с некоторыми уточнениями относительно того, когда использование фрагментов будет неуместным уместным. (Раздел 7.1.2)

Важные моменты из Раздел 7.1.2. Местоположение:

Если значение Location, предоставленное в ответе 3xx (перенаправление) не имеет компонента фрагмента, агент пользователя ДОЛЖЕН обрабатывать перенаправление, как если бы значение унаследовало компонент фрагмента URI ссылки, использованной для генерации цели запроса (т.е. перенаправление наследует фрагмент исходной ссылки, если таковой имеется).

Например, запрос GET-запрос, сгенерированный для ссылки URI "http://www.example.org/~tim" может привести к ответу 303 (See Other) ответ, содержащий поле заголовка:

Location: /People.html#tim

что предполагает, что агент пользователя перенаправляет на "http://www.example.org/People.html#tim"

Аналогично, запрос GET, сгенерированный для ссылки URI "http://www.example.org/index.html#larry" может привести к ответу 301 (Moved Permanently) ответ, содержащий поле заголовка:

Location: http://www.example.net/index.html

что предполагает, что агент пользователя перенаправляет на "http://www.example.net/index.html#larry", сохраняя оригинальный идентификатор фрагмента.

Это должно четко ответить на ваши вопросы.

ОБНОВЛЕНИЕ КОНЕЧНО

это открытый (не уточненный) вопрос в текущей спецификации HTTP. Он рассматривается в двух вопросах рабочей группы IETF httpbis:

#6 разрешает фрагменты в заголовке Location. В #43 говорится следующее:

Я только что протестировал это с различными браузерами.

  • Firefox и Safari используют фрагмент в заголовке location.
  • Opera использует фрагмент из исходного URI, если он присутствует, иначе фрагмент из перенаправления местоположения
  • IE (8) игнорирует фрагмент в URI местоположения, поэтому будет использовать фрагмент из исходного URI, если он присутствует

Предложение:

"Примечание: поведение, когда идентификаторы фрагментов из исходного URI и перенаправления должны быть объединены, не определено; текущие пользовательские агенты действительно различаются по тому, какой фрагмент имеет приоритет."

[...]

Похоже, что IE8 действительно использует идентификатор фрагмента из Location (поведение, которое я видел, может быть ограничено локальным хостом).

Таким образом, мы, похоже, имеем последовательное поведение для Safari/IE/Firefox/Chrome (только что протестировал), в том, что фрагмент из заголовка Location используется, независимо от того, каким был исходный URI.

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

это приведет к наиболее совместимому с браузерами и перспективному (потому что этот вопрос в конечном итоге будет стандартизирован) ответу на ваш вопрос:

A: фрагменты из оригинальных URL отбрасываются.

B: фрагменты из заголовка Location учитываются.

129
ответ дан 24 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: