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



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



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



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





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



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


939   3  

3 ответов:

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

RFC 7231, Hypertext Transfer Protocol (HTTP / 1.1): Semantics and Content, был опубликован в качестве предлагаемого стандарта. Из списка изменений :

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

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

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

Например, a Получить запрос, сгенерированный для ссылки 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 . он рассматривается в 2 выпусках рабочей группы IETF httpbis :

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

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

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

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

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

[...]

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

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

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

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

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

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

Просто чтобы вы знали, здесь вы можете найти правильные спецификации. по 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-адрес (a частный случай URI), который указывает на другой через HTTP перенаправлять. Дополнительные сведения см. В разделе " постоянный единый ресурс Локаторы" [изнаночной]. Пример:

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

Comments

    Ничего не найдено.