2011-12-15 1 views
4

Это должно быть легко ...301 Перенаправления в PHP: Нужно ли мне явно указывать, что это 301?

Нужно ли мне явно указывать PHP, что я хочу сделать 301-редирект? Как это ...

<?php 
header("HTTP/1.1 301 Moved Permanently"); 
header("Location: http://www.example.com/"); 
?> 

Обычно я оставляю от первого заявления и просто сделать ...

<?php 
header("Location: http://www.example.com/"); 
?> 

бы, что второй пример на самом деле быть 302 редирект?

+1

Насколько сложно было загрузить как сервер, так и проверить заголовки для кода состояния? На моем Win32 Apache PHP 5.3.2 я получаю 301 для первого случая и 302 для второго –

+0

Опираясь на наблюдаемое поведение, хрупкое в лучшем случае, хотя результаты верны. – Piskvor

+0

@Piskvor согласился, но вы всегда можете быть уверены в наблюдаемом поведении, и это не всегда так, как описано в руководстве. :) –

ответ

6

Да.

Цитирую the fine manual:

Второй частный случай это "Location:" заголовок. Он не только отправляет этот заголовок обратно в браузер, но также возвращает код статуса REDIRECT (302) в браузер, если код статуса 201 или 3xx уже не установлен.

Наиболее вероятной причиной этого является то, что 302 Found является перенаправлением неспециализированного назначения. Существует четыре заголовка перенаправления 3xx, которые вы можете использовать.

  • 301 Moved Permanently является постоянной переадресации, например, для обеспечения совместимости со старыми URL-адресами. Таким образом, многие браузеры будут кэшировать местоположение перенаправления и не будут проверяться снова.
  • 303 See Other является перенаправленным, например, для действия Post-Redirect-Get - обратите внимание, что он определен только как HTTP/1.1
  • 307 Temporary Redirect означает «да, это обычно здесь, но прямо сейчас, ресурс где-то еще» - это может быть не то значение, которое вы хотите : например вы всегда хотите перенаправить на этом этапе. Опять же, определено в HTTP/1.1
  • И, наконец, 302 Found является перенаправлением неуказанного назначения - для использования, когда вышеуказанное не применимо или когда требуется совместимость с протоколом HTTP/1.0 (это все еще проблема в 2011 году?); как таковой, он используется как значение по умолчанию.
+0

ответил на мой вопрос отлично, спасибо Писквор! –

+0

фактически, еще один мой вопрос только что выскочил. Как Google (и другие SE) знают, было ли перенаправление 301 или 302? Я читал, как 301 нужно использовать, когда перенаправление страниц с 302 года является временным, но как они узнают разницу? Могут ли они переходить и читать файл перенаправления как 301 или 302?Мне всегда казалось, что PHP не читается всеми, кроме веб-сервера –

+0

@Garrett Leyenaar: PHP не читается; ответ HTTP, который ваша страница * отправляет * клиенту, запрашивающему его, содержит * код ответа. Вы явно отправляете эти данные клиенту (браузер, веб-паук, что угодно), почему у клиента возникают проблемы с чтением данных, которые вы отправляете на него? См. Соответствующую часть RFC; а именно: Response: http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6 – Piskvor