Intereting Posts
Повторяющиеся ключи для ассоциативных массивов PHP Разбиение страниц в WooCommerce Обертывание 3 объектов или менее внутри / в foreach в PHP Как вернуть внешний html DOMDocument? Facebook – Ошибка анализа URL-адреса ввода, данные не были кэшированы или данные не были очищены PHP register_shutdown_function для запуска, когда сценарий убит из командной строки? Регулярное выражение, чтобы найти строку, содержащуюся между двумя символами, ИСКЛЮЧАЯ разделители Как преобразовать специальные символы в обычные символы? Как изменить массив в PHP? WooCommerce: получить данные Json в многомерном массиве, соответствующие произвольному полю ACF PHP заменяет слова на ссылки, кроме изображений Определение маршрутизации по умолчанию для контроллера / действия в symfony 2 Не могу прочитать JSON, созданный PHP, в мой javascript Можете ли вы получить имя метода из метода в PHP? Preg_match для следующей строки

Будет ли выполняться весь код после перенаправления заголовка в PHP?

Поэтому я знаю, что общее правило заключается в том, что после перенаправления заголовка на 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..."); после перенаправления каждого заголовка и не видны проблемы.