Поэтому я знаю, что общее правило заключается в том, что после перенаправления заголовка на 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 ().
Спасибо за вашу помощь.
Использование функции заголовка в PHP добавляет только к заголовкам ответа, возвращаемого сервером. Он не сразу отправляет какие-либо данные и не сразу прекращает соединение. Любой код после вызова header
будет выполнен.
В частности, рекомендуется добавить тело ответа даже после 301 перенаправления, чтобы клиенты, не поддерживающие перенаправление, также получали некоторый описательный ответ. Infact согласно спецификации HTTP 1.1 Раздел 10.3.2 –
Если метод запроса не был HEAD, сущность ответа СЛЕДУЕТ содержать короткую гипертекстовую ноту с гиперссылкой на новый URI (ы). Если код статуса 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, в которых был отправлен запрос.
Это состояние гонки. Как только заголовок перенаправления отправляется в браузер, браузер закроет текущее соединение и откроет новый для URL-адреса переадресации. Пока это оригинальное соединение не будет закрыто, и Apache выключит скрипт, ваш код будет продолжать выполняться по-прежнему.
Теоретически, если бы существовала достаточно быстрая связь между клиентом / сервером и не было никакой буферизации в любом месте конвейера, выдача заголовка приведет к немедленному завершению работы скрипта. В действительности, это может быть где угодно между «сейчас» и «никогда» для завершения выключения.
HTML после того, как ваша строка местоположения не запущена внутри PHP; он будет работать в браузере. Это зависит от того, следует ли выполнять Javascript, который вы включили на эту страницу; PHP не имеет к этому никакого отношения.
Для меня в документах PHP подразумевается, что любой PHP под header()
при отправке перенаправления будет продолжать работать. Но он «работает» в интерпретаторе PHP, сбрасывая JS в браузер. Нет никакой связи между тем, что он говорит в документах PHP, и независимо от того, запускается ли JS браузером.
EDIT :
Ну, как заметил Анупам Джейн, похоже, что браузеры не прекращают соединение, не получая тело ответа, и это звучит разумно. Поэтому я переосмыслил свой ответ
Это не похоже на то, что они гарантируют выполнение всего следующего кода
Ровно Скорее это предупреждение, если есть разумный код, который не должен выполняться. Например, личное содержимое страницы. Таким образом, помимо отправки заголовка вы также должны убедиться, что никакой конфиденциальный контент не был отправлен, а выход выглядит как довольно надежное решение. Итак, я бы назвал это «убедитесь, что разумный код ниже не выполняется, когда мы перенаправляем».
Таким образом, нет никакой гарантии, что JavaScript на самом деле начнется или завершит выполнение до появления перенаправления.
Точно это кажется, что это не имеет никакого отношения к выполнению сценария, а скорее волю браузера, чтобы выполнить что-либо после получения ответа 3xx. Думаю, я собираюсь проверить это, но вы тоже можете проверить его.
Я заметил, что код все равно выполняется, и несколько заголовков, основанных на операторах if, могут вызывать «ошибку цикла перенаправления». я привык теперь добавлять в die("Redirecting...");
после перенаправления каждого заголовка и не видны проблемы.