Хорошо известно, что фрагмент URL (часть после #
) не отправляется на сервер.
Мне, правда, интересно, как работают фрагменты, когда Location:
задействовано перенаправление сервера (через HTTP-статус 302 и заголовок).
Мой вопрос действительно двоякий:
Если в исходном URL-адресе был фрагмент (
/original.php#foo
) и выполняется перенаправление/new.php
, фрагмент-фрагмент исходного URL-адреса просто теряется? Или это иногда применяется к новому URL?
Будет ли новый URL когда-либо/new.php#foo
в этом случае?Независимо от исходного URL-адреса, если сервер перенаправит на новый URL-адрес с фрагментом (
/new.php#foo
), будет ли этот фрагмент «соблюден»? Или у сервера действительно нет никакого дела, вмешивающегося в фрагмент вообще - и поэтому браузер проигнорирует это, просто перейдя к/new.php
??
Ответы:
Обновление 2014-Jun-27 :
RFC 7231, протокол передачи гипертекста (HTTP / 1.1): семантика и контент , опубликован в качестве ПРЕДЛАГАЕМОГО СТАНДАРТА. Из журнала изменений :
Важные моменты из Раздела 7.1.2. Расположение :
Это должно четко ответить на ваши вопросы.
Обновить END
это открытая (не указанная) проблема с текущей спецификацией HTTP . он рассматривается в двух выпусках рабочей группы IETF httpbis :
# 6 позволяет фрагменты в
Location
заголовке. # 43 говорит это:это приводит к тому, что браузер будет наиболее совместимым и пригодным для будущего (поскольку эта проблема в конечном итоге будет стандартизирована), ответ на ваш вопрос:
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.
источник
Location
содержит фрагмент, он сохранит его правильно. Но если перенаправлениеLocation
с фрагментом проходит через перенаправление 3xx, он необъяснимым образом проигнорирует фрагмент из первого перенаправления, что не согласуется с 2 предыдущими поведениями. Chrome и Firefox последовательно сохраняют его.Просто, чтобы вы знали, здесь вы можете найти соответствующую спецификацию. w3c, определяющий, как все должно себя вести: http://www.w3.org/TR/cuap#uri - пункт 4.1 - см. ниже:
источник
Публикация аналогичной проблемы с решением, с которым столкнулся я.
Надеюсь, что это помогает кому-то с аналогичным требованием
preserving hash in IE
для 302 перенаправлений.Добавление основных частей ответа вместо одних ссылок
Мы используем
SiteMinder
аутентификацию в нашем приложении.Я выяснил, что после успешной аутентификации
SiteMinder
выполняет302 redirection
запрашиваемую пользователем страницу приложения, используя скрытую переменную формы входаvalue
(где хранится запрошенный пользователем URL-адрес/myapp/
-without hash fragment
поскольку он не будет отправлен на сервер) с именем, похожим наredirect
. Пример формы нижеПоскольку значение
redirect
скрытой переменной содержит только фрагмент без хэша и это перенаправление 302, этот фрагмент хэша автоматически удаляется IE даже до того, как он попадает в наше приложение, и какие бы решения мы ни пытались применить в коде нашего приложения, они не работают./myapp/
IE перенаправляет
/myapp/
только на и он попадает на домашнюю страницу по умолчанию нашего приложенияhttps://ourapp.com/myapp/#/home
.Потеряли почти день, чтобы выяснить это поведение.
Решение:
Изменили форму Войти скрытой переменной (
redirect
) значение для хранения хэш - фрагмент, прилагаяwindow.location.hash
вместе с существующим значением. Аналогично приведенному ниже кодуПосле этого изменения
redirect
скрытая переменная сохраняет запрашиваемое пользователем значение URL-адреса/myapp/#/pending/requests
иSiteMinder
перенаправляет его/myapp/#/pending/requests
в IE.Вышеупомянутое решение отлично работает во всех трех браузерах
Chrome, Firefox and IE
.Спасибо @AlexFord за подробное объяснение и решение этой проблемы.
источник