RFC, похоже, предполагает, что клиент должен постоянно кэшировать ответ: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
10.3.2 301 Перемещено на постоянной основе
Запрошенный ресурс назначил новый постоянный URI и любой будущие ссылки на этот ресурс СЛЕДУЕТ использовать один из возвращенных URI. Клиенты с возможностями редактирования ссылок должна автоматически перерисовываться ссылки на Request-URI на один или больше возвращенных ссылок сервером, где это возможно. Эта ответ кэшируемый, если не указано в противном случае.
Новый постоянный URI ДОЛЖЕН быть предоставлен по полю Location в ответе. Если метод запроса не был HEAD, субъект ответа СЛЕДУЕТ содержат короткую гипертекстовую заметку с гиперссылка на новый URI (ы).
Если код статуса 301 принят ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправить запрос если это не может быть подтверждено пользователя, поскольку это может изменить условия, при которых выдан.
Note: When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request.
Мне сложно найти конкретную документацию браузера для любого крупного браузера, в котором говорится, как они справляются с этим.
Я начал копать исходный код firefox, но быстро потерялся.
Является ли следующий сценарий истинным, для которого (если есть), браузерами, и есть ли окончательная документация для Firefox или IE, которая заявляет столько?:
Первое время:
- 1.1: Пользователь вводит ссылку на сайт A или нажимает ссылку, направленную на сайт A
- 1.2: Браузер интерпретирует ссылку на сайте A, первый раз, без кеша. Отправляет GET на сайт A.
- 1.2: Сайт A отвечает 301 переадресацией на сайт B
- 1.3: Браузер отправляет GET на сайт B.
Любые последующие времена:
2.2: Пользователь нажимает на ссылку, направленную на сайт А 2.2: Браузер видит, что из-за переадресации в прошлом 301 сайт А теперь должен быть сайтом B. 2.3: без инициирования какого-либо запроса на сайте A браузер инициирует GET на сайте B.