Мне нужно использовать exit после заголовка ( "Location: http://localhost/..." );?

Я создаю script для проверки формы, и я задавал себе вопрос. Когда я использую заголовок (см. Пример ниже), мне нужно использовать exit сразу после? Я имею в виду, что использование заголовка также означает, что оно выдается по умолчанию, поэтому мне не нужно использовать команду exit?

// cancel button clicked
if (isset($_POST['cancel'])) {
  header("Location: http://localhost/admin/tracks.php");
  exit;
}

echo '<p>$name</p>'

Ответы

Ответ 1

Вы должны называть exit(), потому что header() не будет автоматически останавливать выполнение script - или если это так (я честно не 100% от этого), это определенно не останавливает script мгновенно.

Например, попробуйте этот код:

<?php

  header("Location: http://www.google.com");
  unlink(__FILE__);

?>

Этот маленький script использует header() для перенаправления вас в Google, а затем удаляет себя. Если вы запустите его, вы заметите, что после того, как вы были перенаправлены, файл все еще был удален. Это означает, что вызов unlink() все еще выполнялся, даже если вызов header() перенаправил вас.

Ответ 2

Я использую exit после вызова location- > location, потому что я хочу, чтобы иметь возможность полагаться ABSOLUTELY на то, что script не пройдет мимо вызова заголовкa → .

Если где-то есть ошибка и ваш script начинает генерировать вывод перед вызовом location- > location, вызов завершится неудачно, а выполнение script будет продолжаться в обычном режиме (если вы не вызываете exit)

Ответ 3

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

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

Вы используете фреймворк (ОС или пользовательский), который ожидает переадресации журнала, или установите дополнительные заголовки (или любое количество других элементов). Вызывая exit, вы обходите эту логику и, следовательно, можете получить неожиданные результаты.

Короче говоря, да, эти методы будут работать, просто предостережение, чтобы знать, что вы ожидаете, до того, как оно будет коротким.

Ответ 4

Вывод обычно не отправляется (в зависимости от буферизации вывода и т.д.), если вы перенаправляете подобное, но, как показано в примере unlink(), script не умирает с заголовком().

Таким образом, вызовы exit() или die() необходимы, если вы хотите предотвратить продолжение script после перенаправления.

Ответ 5

Использование заголовка также означает, что оно по умолчанию завершено

Как так? Что, если ваш заголовок не Location: один, а Content-type: или Cache-control или что-то еще?