PHP: использование exit ();или умри();после заголовка («Местоположение:»); - PullRequest
16 голосов
/ 29 декабря 2011

У меня есть система входа / регистрации пользователя, которая просто использует

// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));

Я недавно прочитал пост о exit(); и die(); и не знал, что я должен был использовать их.Из того, что я понимаю, они делают это конец PHP?Это верно?Как лучше всего это сделать, просто добавив одну из этих функций сразу после заголовка ();У меня есть выполнение?

У меня есть AJAX, чтение jQuery через мой login.php / register.php, это как-нибудь повлияет?

Редактировать: кроме как после header () ;,где еще я должен использовать функции exit(); или die();exit(); больше используется в PHP, тогда как die(); больше используется в Perl?

Ответы [ 5 ]

34 голосов
/ 05 января 2014

Я тоже искал ответ на этот вопрос.Что я нашел:

Почему 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

10 голосов
/ 29 декабря 2011

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

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

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

4 голосов
/ 29 декабря 2011

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

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

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

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

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

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

1 голос
/ 21 марта 2017

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

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

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

1 голос
/ 14 апреля 2014

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

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

...