PHP: использование exit(); или die (); после заголовка ("Location: ");
у меня есть система входа/регистрации пользователя, которая просто использует
// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
недавно я прочитал сообщение о exit();
и die();
и понятия не имел, что я должен был использовать их. Из того, что я понимаю, они делают это конец PHP? Это верно? Каков наилучший способ, которым я могу работать над этим, просто добавив одну из этих функций непосредственно после ever header(); выполнение у меня есть?
у меня есть AJAX, jQuery чтение через мой логин.php / Регистрация.php, будет ли это влиять в любом случае?
изменить: другие, чем после заголовка();, где еще я должен быть usitilizing в exit();
или die();
функции? И exit();
больше используется вокруг PHP, тогда как die();
больше используется вокруг Perl?
5 ответов
я тоже искал ответ на этот вопрос. Что я нашел:
почему die () или exit ():
если вы не ставите die() или exit () после вашего header('Location: http://something')
ваш скрипт может продолжать приводить к неожиданному поведению. Это может, например, привести к раскрытию содержимого, которое вы действительно хотели предотвратить с помощью перенаправления (HTTP 301). Вышеупомянутое не может быть непосредственно видно конечному пользователю, поскольку браузер не может его отображать (из-за 301). Заключение функции exit () и die () останавливают продолжение сценария.
отличия:
Я также хотел бы знать разницу между функциями, как кажется нет. Однако в PHP существует явная разница в выводе заголовка. В приведенных ниже примерах я решил использовать другой заголовок, но для того, чтобы показать разницу между exit() и die (), это не имеет значения.
Exit () в действии
<?php
header('HTTP/1.1 304 Not Modified');
exit();
?>
результаты в:
HTTP/1.1 304 Not Modified
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Die() в действии
<?php
header('HTTP/1.1 304 Not Modified');
die();
?>
результаты:
HTTP/1.1 304 Not Modified
Connection: close
разница
и die () закрывает соединение и exit () не делает. Это зависит от производительности, хотите ли вы сохранить соединение открытым или закрыть его. Оба имеют преимущества и недостатки и зависят от ваших специфических требований.
http://php.net/manual/en/function.exit.php
http://php.net/manual/en/function.die.php
эти функции используются для прерывания выполнения скрипта. Вы нужно использовать exit
или die
чтобы остановить выполнение скрипта после header("Location: " . getenv("HTTP_REFERER"));
, потому что, в другом случае, ваш скрипт будет выполняться до конца, что может вызвать некоторое неожиданное поведение.
ответ уже принят, однако кажется, что всем не хватает вопиющего WTF в вопросе:
header("Location: " . getenv("HTTP_REFERER"));
возврат реферера является необязательным со стороны агента пользователя
его можно легко подделать
нет способа сообщить пользователю, что вход в систему не удался
отсутствует семантическая связь HTTP аутентификации неудача
хотя переменная среды HTTP_REFERER должна быть такой же, как переменная заголовка запроса, она не указана в RFC 3875, поэтому даже там, где она представлена веб-серверу в запросе, getenv("HTTP_REFERER") может возвращать другое значение
, когда header()
вызывается в конце скрипта, нет необходимости называть exit()
, nor die()
С:
ссылка на сервер будет закрыта, как только закончится выполнение скрипта, если он не закрыт ранее явным вызовом mysql_close (). - php.net/function.mysql-connect
хорошо, прошло много времени с тех пор, как был дан последний ответ. В любом случае: D как-то я наткнулся на подобную проблему и увидел, что мое решение было:
die( Header( "Location: mytarget.php?arg1=foobar" ) );
две птицы с одним камнем - кажется, работает для меня.