Apache сбрасывает соединение, когда PHP сообщает это 404 - PullRequest
0 голосов
/ 27 января 2012

Учитывая следующий код 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-х и тает?

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

1 Ответ

1 голос
/ 27 января 2012

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

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

...