Подскажите сколько тип направление есть в php?

Рейтинг: 0Ответов: 2Опубликовано: 13.04.2015

Подскажите сколько тип направление есть в php? Кроме

header('Location: news');
exit();

и

exit("<meta http-equiv='refresh' content='0; url= /index.php'>");

Ответы

▲ 3

На самом деле существует всего два типа перенаправления (на самом деле - вообще один). Первый предусматривает перенаправление на уровне протокола (если грубо, то тот самый header location), второй - так или иначе заставить браузер выполнить переход. Второй крайне нежелателен по той причине, что на страницу будут заходить не только браузеры, но еще поисковики, боты пятнадцатилетних хакиров и Internet Wayback Machine, и в этом случае браузер будет просто отсутствовать.

Браузер (точнее сказать - клиент) и сервер общаются друг с другом по протоколу HTTP. Этот протокол позволяет передавать общую информацию о запросе (клиент передает адрес запрашиваемого ресурса, серевер отдает статус выполнения запроса), мета-информацию (дополнительные заголовки - время модификации, куки и пр.) и само тело запроса или ответа (тело ответа и является веб-страницей). Сервер в обязательном порядке отдает статус запроса - трехзначный код, характеризующий выполнение или невыполнение операции. Все статусы, начинающиеся с двойки означают успешное выполнение запроса, с тройки - перенаправление, с четверки - неправильный запрос, с пятерки - ошибку на сервере. В контексте этого вопроса интересуют статусы 3xx, потому что именно они отвечают за перенаправление. Когда на сервере выполняется команда, аналогичная header('Location: news');, то PHP автоматом устанавливает статус ответа в 302 (если я правильно помню), и, таким образом, тот, кто получит ответ, однозначно будет уведомлен о перенаправлении, а ответ будет выглядеть примерно так:

302 Temporarily Moved
Location: news

(да-да, на самом деле в интернете все просто обмениваются кусками текста)

Клиент в этом случае прочитает 302, прочитает Location и перенаправится.

Все вышеописанно является частью протокола HTTP. Управление через <meta> в тексте документа и window.location в javascript является нежелательным из-за того, что не все клиенты читают содержимое ответа и не все клиенты его правильно интерпретируют (так, как хочется автору). Единственный и правильный safe-way - это использовать перенаправление через header() (возможно, кроме простого location есть еще другие заголовки с аналогичной функцией, но они наверняка предназначены для других целей), потому что иначе вас не поймут все небраузерные клиенты, и на Internet Wayback Machine в результате окажется страница, которая будет перенаправлять пользователя в никуда. Наверняка существует порядка десяти "браузерных" способов перекинуть пользователя, но использовать их - некорректно.

В качестве постскриптума: любые действия в PHP приведут к тому, что либо сформируется определенный HTTP-ответ, либо сформируется HTML-документ, в котором в том или ином виде браузеру будет рекомендовано совершить переход. PHP в этом случае реально не занимается ничем большим, чем формированием ответа; эти же операции мог бы проделать любой другой язык, а результатом работы является простой текстовый документ, который можно хоть руками в блокноте набить (но не стоит, конечно).

▲ 1
  1. header() -> Location
  2. Request-URI
  3. Content-Location : http://example.com

также можно извратится при помощи JS

echo '<script type="text/javascript">'; 
echo 'window.location.href="'.$url.'";'; 
echo '</script>';