PHP: Влияние кода после заголовка («Местоположение: abc.html»)

Допустим, код выглядит примерно так:

if(!$test) { header("Location: somefile.html"); ...some PHP code.... header("Location: anotherfile.html"); } 

Выполняется ли какой-нибудь PHP-код ? Если да, то что происходит с последующим HTTP-ответом (-ами) в нем (например: второй оператор заголовка в коде)?

Да – код будет выполнен.

header() будет настраивать возвращаемые заголовки, а не отправлять их сразу.

  • Если между двумя вызовами нет выхода, будет учтен только последний .

  • Однако, если вы выведете что-либо перед вторым вызовом, то заголовки будут отправлены , а второй вызов приведет к ошибке (уже отправленные заголовки).

Классическая ошибка: перенаправление и не exit() сразу после этого, что может вызвать проблемы с безопасностью.

правило заключается в том, что при переадресации заголовка выведите его прямо после:

 if(!$test) { header("Location: somefile.html"); exit; //wont ever run ...some PHP code.... header("Location: anotherfile.html"); } 

если вы не поместите exit есть вероятность, что следующий код может работать.

Да, будет запущен «некоторый PHP-код». Заголовок Location похож на любой другой заголовок. Он может быть отправлен только в том случае, если скрипт выполнен. Таким образом, любой код между ними, предполагая, что нет выхода, должен быть запущен до того, как заголовок имеет значение.

выполняется другой код.

header («Местоположение: xxx»);

не останавливает выполнение кода. и для браузера может потребоваться некоторое время.

 header("Location: http://www.google.com"); $test = "Hi!"; header("Location: http://www.yahoo.com?t=" . $test); 

Этот код берет мой браузер: http://www.yahoo.com/?t=Hi !

Выполняется код после header("location") . Вы должны использовать exit(); если вы этого не хотите 🙂

Перенаправление выполняется напрямую, так что вы, вероятно, не увидите эффект вещей ниже первого заголовка.