#php #apache
#php #apache
Вопрос:
Я использую много перенаправлений заголовков, но из-за этого я пропускаю некоторые предупреждения PHP, которые не отображаются из-за перенаправления. Есть ли какой-нибудь параметр конфигурации PHP / Apache, который остановил бы перенаправление заголовка, если будут выданы какие-либо предупреждения?
На самом деле я хотел бы, чтобы любые предупреждения останавливали выполнение скрипта (например, ошибки) на моей машине разработки, но были невидимыми на других серверах — так что это означает некоторую настройку конфигурации, а не изменение скриптов. Возможно ли это? Я использую Apache 2.2 и PHP 5.2
Все предупреждения обычно отображаются на моем сервере разработки, но когда за ними следует перенаправление заголовка, я их не вижу. Пример:
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
unset($undef);
echo $undef; // generates warning, should stop redirect.
//exit;
//when previous line is uncommented, I see the warning
header("Location: http://www.google.com"); // still happens, but shouldn't
exit;
?>
Комментарии:
1. Мое предложение в подобных средах — в значительной степени полагаться на ваш журнал ошибок.
Ответ №1:
На ваших серверах разработки поместите:
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 'On');
ob_start();
...
if(ob_get_length() > 0){
ob_flush();
exit();
}
header(...);
перед перенаправлением заголовка (как показано). Если что-то находится в буфере, оно будет отображено, и это приведет к сбою перенаправления заголовка, потому что невозможно выполнить перенаправление заголовка, если что-то было отображено в браузере. Если вы включите display_errors
Off
на своих производственных серверах, эти сообщения не будут отображаться.
Комментарии:
1. Я помещаю это поверх скрипта, и перенаправления все равно происходят после создания предупреждений. Я повторяю некоторый $undefinedvariable перед вызовом header(), и он генерирует предупреждение, но header() все еще перенаправляет.
2. Опубликуйте код, с которым у вас возникла проблема, в своем вопросе. Если вы считаете, что генерируется предупреждение, выполните
exit()
перед вашимheader()
, чтобы подтвердить свою теорию.3. если я поставлю exit; перед header(), я увижу предупреждение. Если выхода нет; тогда перенаправление происходит так, как если бы предупреждение не было показано. Именно так я обычно проверяю наличие предупреждений перед перенаправлением, путем exit; непосредственно перед вызовом header(), но это слишком сложно менять и менять каждый раз.
4. Пожалуйста, напишите, что вы видите на свой вопрос. Я не могу отлаживать то, что не вижу.
5. Выполнено. Все сообщения об ошибках на моем сервере разработки были включены для начала, просто предупреждения по какой-то причине не прерывают перенаправление заголовка.
Ответ №2:
Сделайте что-то вроде этого:
//header("location: such-and-such");
лол, но на самом деле; это не так просто.