Будет ли выполняться весь код после заголовка перенаправления в PHP? - PullRequest
2 голосов
/ 30 августа 2011

Итак, я знаю общее правило: после перенаправления заголовка в PHP вы должны вызывать exit (), чтобы избежать запуска дополнительного кода, но я хочу знать, поместите ли вы код после заголовка перенаправления, если он будет всегда бегать?

Я изучал различные способы отслеживания рефералов в Google Analytics и наткнулся на этот пост: Советы и рекомендации Google Analytics - Отслеживание 301 переадресации в Google Analytics

Он рекомендует сделать что-то вроде этого:

<?
Header( “HTTP/1.1 301 Moved Permanently” );
Header( “Location: http://www.new-url.com” );
?>

<script type=”text/javascript”>
var gaJsHost = ((“https:” == document.location.protocol) ? “https://ssl.” : “http://www.”);
document.write(unescape(“%3Cscript src=’” + gaJsHost + “google-analytics.com/ga.js’ type=’text/javascript’%3E%3C/script%3E”));
</script>
<script type=”text/javascript”>
try {
var pageTracker = _gat._getTracker(“UA-YOURPROFILE-ID”);
pageTracker._trackPageview();
} catch(err) {}</script>

Из того, как я всегда понимал функцию header (), дело за браузером, и он может запускать перенаправление в любое время.Таким образом, нет никакой гарантии, что JavaScript будет фактически начинаться или заканчиваться до того, как произойдет перенаправление.

Документация PHP для функции header () указывает причину выхода после перенаправления в том, чтобы "убедиться, что приведенный ниже код не выполняется, когда мы перенаправляем".Это не похоже на то, что они гарантируют, что весь следующий код будет работать, просто это может произойти.

Несмотря на это, я нашел другой способ на самом деле управлять отслеживанием, но я хотел посмотреть, смогу ли я узнать, как именно работает header () в этой ситуации ..

Спасибо за вашу помощь.

Ответы [ 5 ]

3 голосов
/ 30 августа 2011

Использование функции заголовка в PHP только добавляет к заголовкам ответа, возвращаемого сервером.Он не сразу отправляет какие-либо данные и не прерывает соединение немедленно.Любой код после header вызова будет выполнен.

В частности, рекомендуется добавить тело ответа даже после выполнения перенаправления 301, чтобы клиенты, которые не поддерживаютперенаправление также получить некоторый описательный ответ.Фактически согласно спецификации HTTP 1.1 Раздел 10.3.2 -

Если метод запроса не является HEAD, объект ответа ДОЛЖЕН содержать короткий гипертекстобратите внимание с гиперссылкой на новый URI.Если код состояния 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых был выполнен запрос.

3 голосов
/ 30 августа 2011

Это состояние гонки.После отправки заголовка перенаправления в браузер, браузер закроет текущее соединение и откроет новое для URL перенаправления.Пока это исходное соединение не будет закрыто и Apache не закроет сценарий, ваш код будет продолжать выполняться так же, как и раньше.

Теоретически, если между клиентом и сервером было достаточно быстрое соединение и нигде не было буферизациив конвейере выдача заголовка приведет к немедленному завершению сценария.На самом деле, это может быть где-то между «сейчас» и «никогда» для начала отключения.

0 голосов
/ 17 февраля 2014

Я заметил, что код все еще выполняется и несколько заголовков основаны на том, что операторы могут вызвать «ошибку цикла перенаправления».я сделал это привычкой теперь добавлять die("Redirecting..."); после каждого перенаправления заголовка и не вижу, что проблема сохраняется.

0 голосов
/ 30 августа 2011

EDIT

Что ж, как отметила Anupam Jain, похоже, что браузеры не прекращают соединение без получения тела ответа, и это звучит разумно. Поэтому я переосмыслил свой ответ

Не похоже, что они гарантируют, что весь следующий код будет работать

Точно Скорее всего, это предупреждение в случае, если есть какой-то разумный код, который не должен выполняться. Частное содержание страницы, например. Таким образом, помимо отправки заголовка вы также должны убедиться, что конфиденциальный контент не был отправлен, и выход выглядит как довольно надежное решение. Поэтому я бы сказал, что «убедитесь, что разумный приведенный ниже код не будет выполнен, когда мы будем перенаправлять».

Таким образом, нет никакой гарантии, что JavaScript действительно начнет или завершит выполнение до возникновения перенаправления.

Точно Кажется, это не имеет ничего общего с выполнением скрипта, а скорее с желанием браузера выполнить что-либо после получения ответа 3xx. Я думаю, что я собираюсь проверить это, но вы также можете проверить это.

0 голосов
/ 30 августа 2011

HTML после вашей строки Location не запускается внутри PHP; это будет работать в браузере. Браузеру решать, выполнять или нет Javascript, который вы включили на этой странице; PHP не имеет к этому никакого отношения.

Для меня документы PHP подразумевают, что любой PHP ниже header() при отправке перенаправления будет продолжать работать. Но он «запускается» в интерпретаторе PHP, сбрасывая JS в браузер. Нет никакой связи между тем, что написано в документах PHP, и тем, запускается ли JS браузером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...