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?

 15
Author: Pradeep, 2011-12-29

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-соединения в Вики

 29
Author: GrayMatter, 2014-01-05 10:31:47

Http://php.net/manual/en/function.exit.php

Http://php.net/manual/en/function.die.php

Эти функции используются для прерывания выполнения скрипта. Вам нужно использовать exit или die, чтобы остановить выполнение вашего скрипта после header("Location: " . getenv("HTTP_REFERER"));, потому что в другом случае ваш скрипт будет выполняться до конца, что может вызвать некоторое неожиданное поведение.

 8
Author: Timur, 2011-12-29 09:32:30

Ответ уже принят, однако, похоже, всем не хватает вопиющего WTF в вопросе:

header("Location: " . getenv("HTTP_REFERER"));
  1. Возврат референта является необязательным со стороны агента пользователя

  2. Его легко можно подделать

  3. Не существует способа сообщить пользователю, что вход в систему не удался

  4. Отсутствует семантическая связь HTTP при сбое аутентификации

  5. В то время как переменная среды HTTP_REFERER должна быть так же, как и переменная заголовка запроса, она не указана в RFC 3875, поэтому, даже если она представлена веб-серверу в запросе, getenv("HTTP_REFERER") может возвращать другое значение

 4
Author: symcbean, 2011-12-29 13:08:43

Когда header() вызывается в конце сценария, нет необходимости вызывать exit() или die(), так как:

Ссылка на сервер будет закрыта, как только закончится выполнение скрипта, если только она не будет закрыта ранее явным вызовом mysql_close(). - php.net/function.mysql-connect

 2
Author: cPage, 2016-05-30 19:14:52

Хорошо, прошло много времени с тех пор, как был дан последний ответ. В любом случае:D каким-то образом я наткнулся на подобную проблему и посмотрел, каким было мое решение:

die( Header( "Location: mytarget.php?arg1=foobar" ) );

Двух зайцев одним выстрелом - кажется, это работает для меня.

 1
Author: Wulfgier, 2017-03-22 09:52:07