Apache сбрасывает соединение, когда PHP сообщает об этом 404

Учитывая следующий код PHP 5.1.6, обслуживаемый через Apache 2.2.9:

<?php
header("HTTP/1.1 404 Not Found");

Когда я просматриваю этот файл (в любом браузере), я получаю сообщение «сброс соединения». (Firefox говорит: «Соединение с сервером было сброшено во время загрузки страницы», а Chrome говорит: «Соединение с staging.neopets.com было прервано». Не имеет значения, есть ли какое-либо тело после вызова заголовка.

httpd.conf имеет правила перезаписи, которые заставляют все запросы выполняться через скрипт переднего контроллера. Вот так это работает годами. Фронт-контроллер пытается направить запрос, и если он не может, он устанавливает код ответа на 404, показывает какую-то копию ошибки и завершает работу. По какой-то причине сегодня он решил сойти с ума и взорваться всякий раз, когда

error.log ничего не показывает. access.log показывает запросы, обслуживаемые как 404:

192.168.0.2 - - [26/Jan/2012:12:03:11 -0800] "GET /text.php HTTP/1.1" 404 20 "-" "Mozilla/5.0 (X11; Linux i686; rv:8.0.1) Gecko/20100101 Firefox/8.0.1"

Конфигурация Apache не менялась несколько месяцев. Все остальные ответы заголовков работают нормально (401, 403, 200, 302 и т. д.), все остальное совершенно нормально, но по какой-то причине, если у меня PHP делает вызов выше, он сбрасывает соединение.

Я даже наблюдал это с помощью Wireshark, и он отправляет обратно целую кучу RST,ACK пакетов после отправки запроса.

Выполнение wget localhost/test.php (с рассматриваемой машины) работает нормально, но выполнение wget badhost/test.php (с другой машины) также показывает ошибку сброса соединения. Может быть, Apache выполняет какой-то обратный поиск IP-адресов при удаленных запросах на 404-е и плавится?

РЕДАКТИРОВАТЬ: после дальнейшего расследования выяснилось, что это какая-то проблема с сетью, когда ошибки 404 между хостингом и нашим офисом уничтожаются при сбросе соединения. Итак, закрываю, потому что никто здесь не может ответить ;-) Спасибо!


person dirtside    schedule 26.01.2012    source источник


Ответы (1)


Тот заголовок, который вы отправляете из своего PHP-скрипта, не заставляет Apache отображать страницу 404. Apache отображает страницу 404 (и отправляет заголовок 404), когда не может найти запрошенный файл. Поскольку здесь это не так (потому что test.php найден и выполнен), этот заголовок 404 не имеет смысла. Это, вероятно, то, что запутало ваш браузер (ы).

Если вы вызываете это как часть какой-либо обработки ошибок приложения или что-то в этом роде, вместо этого вы должны перенаправить пользователя на пользовательскую страницу приложения «Файл не найден».

person Radu Murzea    schedule 26.01.2012
comment
Вы можете управлять заголовком ответа Apache, используя функцию PHP header(), как я описал; Я делал это десятки раз в разных проектах. Да, я предпочитаю, чтобы Apache справился с этим, но выполнение header("HTTP/1.1 404 Not Found") прекрасно работает в любом другом месте, где я когда-либо его использовал. Другие серверы с теми же версиями PHP/Apache и конфигурацией корректно обрабатывают вызов header(). По какой-то причине конкретный экземпляр Apache (который отлично работал в течение многих лет, делая именно это) теперь решил, что ответ 404, запускаемый PHP, должен вызывать сброс соединения. - person dirtside; 27.01.2012