Нужно ли использовать HTTP-код перенаправления 302 или 307?

Предположим, у меня есть страница на моем веб-сайте, чтобы показать выпуски СМИ за текущий месяц
http://www.mysite.com/mediareleases.aspx

И по причинам, по которым он должен перейти в *, эта страница ДОЛЖНА получить строку запроса с текущим днем ​​месяца, чтобы создать этот список:
http://www.mysite.com/mediareleases.aspx?prevDays=18

Таким образом, мне нужно перенаправить клиентов с запросом http://www.mysite.com/mediareleases.aspx на http://www.mysite.com/mediareleases.aspx?prevDays=whateverDayOfTheMonthItIs

Мой вопрос: если я хочу, чтобы Google индексировал страницу без параметра запроса, должен ли я использовать код состояния 302 или 307 для выполнения перенаправления?

Оба указывают, что страница "временно" перемещена - это то, что я хочу, потому что страница "перемещается" каждый день, если вы получаете мой смысл.

[*] Я использую функцию CMS с закрытыми исходными кодами, поэтому мои руки привязаны.

Ответ 1

Документация Google, похоже, указывает, что и 302, и 307 обрабатываются эквивалентно, и что "Googlebot будет продолжать сканирование и индексирование исходного местоположения."

Но перед лицом двусмысленности вы также можете вникнуть в RFC и попытаться сделать "Правильную вещь", наивно надеясь, что сканеры сделают то же самое. В этом случае RFC 2616 § 10.3 содержит почти идентичные определения для каждого кода ответа, за одним исключением:

302: Так как перенаправление может быть изменено иногда, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов.

307: Так как перенаправление MAY может быть изменено иногда, клиент ДОЛЖЕН продолжать использовать Request-URI для будущих запросов.

Который не считает меня значительным различием. Мое чтение гласит, что 302 инструктирует клиентов о том, что веб-мастера недостоверны, а 307 явно сообщает веб-мастерам, что клиенты не будут им доверять, поэтому они могут свободно изменять перенаправление.

Я думаю, что более важным моментом является примечание в определении 302:

Примечание. В RFC 1945 и RFC 2068 указано, что клиенту не разрешено изменять метод при перенаправленном запросе. Однако большинство существующих реализаций пользовательских агентов обрабатывают 302, как если бы это был ответ 303, выполняя GET по значению поля Location независимо от исходного метода запроса. Коды состояния 303 и 307 были добавлены для серверов, которые хотят однозначно понять, какая реакция ожидается от клиента.

Что для меня означает, что 302 и 307 в значительной степени эквивалентны, но клиенты HTTP/1.0 не смогли правильно реализовать 302 в первый раз.

Ответ 2

Короткий ответ: нет. В большинстве случаев код, который вы действительно хотите использовать, составляет 303.

Для длинного ответа сначала нам нужен какой-то фон.

При получении кода перенаправления клиент может (A) загружать новое местоположение с использованием того же типа запроса или (B), он может перезаписать его и использовать GET.

Спецификация HTTP 1.0 не имела 303 и 307, у нее было только 302, что давало мандат (A). Но на практике было обнаружено, что (A) привело к проблеме с представленными формами.

Скажите, что у вас есть контактная форма, посетитель заполняет ее и отправляет ее, а клиент получает 302 на странице, говоря "спасибо, мы вернемся к вам". Форма была отправлена ​​с использованием POST, поэтому страница благодарности также загружается с помощью POST. Теперь предположим, что посетитель попадает в перезагрузку; запрос пересматривается так же, как это было получено в первый раз, что связано с POST (и той же полезной нагрузкой в ​​теле). Конечный результат: форма отправляется дважды (и еще раз для каждой перезагрузки). Даже если клиент запрашивает у пользователя подтверждение, прежде чем делать это, он все еще раздражает в большинстве случаев.

Эта проблема стала настолько распространенной, что производители клиентов решили переопределить спецификацию и выдавать запросы GET для перенаправленного местоположения. В принципе, это был надзор в спецификации HTTP 1.0. Больше всего клиентов было 303 (и поведение (B) выше), но вместо этого они получили только 302 (и (A)).

Если HTTP 1.0 предложил бы как 302, так и 303, не было бы проблем. Но это не так, поэтому это привело к тому, что 302 никто не использовал правильно. Таким образом, HTTP 1.1 добавил 303 (крайне необходимо), но также решил добавить 307, что технически идентично 302, но является своего рода "явным 302"; он говорит: "Да, я знаю проблемы, связанные с 302, я знаю, что я делаю, дайте мне поведение (A)".

Теперь вернемся к нашему вопросу. Теперь вы видите, почему в большинстве случаев вам понадобится 303.

Случаи, в которых вы хотите сохранить тип запроса, очень редки. И если вы найдете себе такой случай, ответ прост: используйте 302. Либо клиент говорит HTTP 1.0, и в этом случае он не может понять 307; или он говорит HTTP 1.1, что означает, что у него нет оснований сохранять бунтующее поведение старых клиентов, т.е. он правильно использует 302, поэтому используйте его!

Ответ 3

5 лет спустя... обратите внимание, что поведение 307 обновлено RFC-7231 # 6.4.7 в июне 2014 года и теперь значительно отличается от 302, поскольку метод может не измениться:

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

Вероятно, это не проблема для исходного вопроса, но может иметь отношение к другим, кто сталкивается с этим вопросом, просто ищет разницу.

Ответ 4

Я чувствую твою боль. Что касается решения, трудно сказать, что будут делать поисковые системы. Кажется, что каждый имеет свой собственный способ обработки перенаправления. Эта ссылка предполагает, что 302 будет индексировать содержимое перенаправленной страницы, но все равно использовать ссылку на главной странице, но не понятно, что будет 307 делать.

Другой способ, которым вы могли бы подумать о продолжении, - это перенаправление javascript и тег <noscript>, объясняющий, что происходит. Это также испортит браузеры, отличные от javascript, и вам нужно будет проявлять осторожность, чтобы избежать Google sneaky-site detection procedure, но я что до тех пор, пока ваш noscript содержит гиперссылку, которая соответствует новому URL-адресу, вы были бы в порядке.

В любом случае, я бы все равно продолжал выполнять чисто серверный запрос, если это вообще возможно. Если ваш ожидаемый трафик будет легким, вы можете рассматривать свою домашнюю страницу как прокси-сервер в случае, когда нет запроса. Используйте ли он фоновый поток, чтобы запросить себя с помощью запроса и вывести результаты.: -)

edit просто видел, что вы используете .NET. Возможно, рассмотрим этот ответ из SO: С# Могу ли я изменить переменные Request.Form?.