Фрагмент URL и 302 перенаправления - PullRequest
128 голосов
/ 18 февраля 2010

Хорошо известно, что фрагмент 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 ??

Ответы [ 3 ]

127 голосов
/ 21 февраля 2010

Обновление 2014-июнь-27 :

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

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

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

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

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

Location: /People.html#tim

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

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

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

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

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

Обновление КОНЕЦ

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

# 6 разрешает фрагменты в заголовке Location. # 43 говорит это:

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

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

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

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

[...]

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

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

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

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

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

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

39 голосов
/ 06 мая 2011

Safari 5 и IE9 и ниже удаляют исходный фрагмент URI, если происходит перенаправление HTTP / 3xx.Если в заголовке Location в ответе указан фрагмент, он используется.

IE10 +, Chrome 11+, Firefox 4+ и Opera все «присоединят» исходный фрагмент URI после перенаправления 3xx.

Тестовая страница: http://www.webdbg.com/test/redir/fragment/.

См. Дальнейшее обсуждение этого вопроса на http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx

9 голосов
/ 01 июля 2012

Просто, чтобы вы знали, здесь вы можете найти правильные спецификации.с помощью w3c, определяющего, как все должно себя вести: http://www.w3.org/TR/cuap#uri - пункт 4.1 - см. ниже:

Когда ресурс (URI1) перемещен, перенаправление HTTP может указать его новое местоположение (URI2).

Если URI1 имеет идентификатор фрагмента #frag, то новой целью, к которой должен попытаться пользовательский агент, будет URI2 # frag.Если URI2 уже имеет идентификатор фрагмента, то #frag не должен добавляться, а новой целью является URI2.

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

Ссылки:

Перенаправления HTTP описаны в разделе 10.3 спецификации HTTP / 1.1 [RFC2616].Требуемое поведение подробно описано в разделе «Обработка идентификаторов фрагментов в перенаправленных URL» [RURL].Термин «Постоянный унифицированный указатель ресурса (PURL)» обозначает URL-адрес (особый случай URI), который указывает на другой с помощью перенаправления HTTP.Для получения дополнительной информации см. «Постоянные унифицированные указатели ресурсов» [PURL].Пример:

Предположим, что пользователь запрашивает ресурс на http://www.w3.org/TR/WD-ruby/#changes, а сервер перенаправляет пользовательский агент на http://www.w3.org/TR/ruby/. Перед извлечением этого последнего URI браузер должен добавить идентификатор фрагмента #изменения к нему: http://www.w3.org/TR/ruby/#changes.

...