PHP: Использование exit(); или die(); после заголовка ("Местоположение:");
У меня есть система входа/регистрации пользователей, которая просто использует
// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
Недавно я прочитал сообщение о exit();
и die();
и понятия не имел, что я должен был их использовать. Из того, что я понимаю, они заставляют его заканчивать PHP? Это правильно? Каков наилучший способ, которым я могу работать в этом направлении, просто добавив одну из этих функций непосредственно после выполнения ever header(); У меня есть?
У меня есть AJAX, jQuery, читающий мои login.php/register.php, повлияет ли это на какое-либо путь?
Редактировать: Кроме как после заголовка();, где еще я должен использовать функции exit();
или die();
? И является ли exit();
более используемым в PHP, тогда как die();
более используемым в Perl?
5 answers
Я тоже искал ответ на этот вопрос. Что я нашел:
Зачем умирать() или выходить():
Если вы не поставите штамп() или выход() после вашего header('Location: http://something')
, ваш сценарий может продолжить работу, что приведет к неожиданному поведению. Это может, например, привести к раскрытию контента, который вы на самом деле хотели предотвратить с помощью перенаправления (HTTP 301). Вышеупомянутое может быть не видно конечному пользователю напрямую, так как браузер может не отображать его (из-за 301). Заключение, выход() и функции die() останавливают продолжение сценария.
Разница:
Я также хотел знать разницу между функциями, поскольку кажется, что ее нет. Однако в PHP существует явная разница в выводе заголовка. В приведенных ниже примерах я решил использовать другой заголовок, но для того, чтобы показать разницу между exit() и die(), это не имеет значения.
Выход() в действии
<?php
header('HTTP/1.1 304 Not Modified');
exit();
?>
Приводит к:
HTTP/1.1 304 Not Modified
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Умереть() в действие
<?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()
или die()
, так как:
Ссылка на сервер будет закрыта, как только закончится выполнение скрипта, если только она не будет закрыта ранее явным вызовом mysql_close(). - php.net/function.mysql-connect
Хорошо, прошло много времени с тех пор, как был дан последний ответ. В любом случае:D каким-то образом я наткнулся на подобную проблему и посмотрел, каким было мое решение:
die( Header( "Location: mytarget.php?arg1=foobar" ) );
Двух зайцев одним выстрелом - кажется, это работает для меня.