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 постоянные соединения на Wiki


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"));
  1. возврат реферера является необязательным со стороны агента пользователя

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

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

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

  5. хотя переменная среды 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" ) );

две птицы с одним камнем - кажется, работает для меня.