Nginx отправляет статус 200 после ошибки синтаксического анализа PHP

#linux #nginx #fastcgi #php

#linux #nginx #fastcgi #php

Вопрос:

Я настроил nginx с php-fpm на Ubuntu (и все работает довольно хорошо).

Одна вещь, с которой я столкнулся, заключается в том, что при возникновении ошибки синтаксического анализа PHP отправляется код состояния HTTP 200. Журнал ошибок содержит следующую запись:

[ошибка] 3205 #0: * 2854 FastCGI отправлено в stderr: «Ошибка синтаксического анализа PHP: синтаксическая ошибка, неожиданный T_REQUIRE_ONCE в /var/www/…/index.php в строке 32 » при чтении заголовка ответа из восходящего потока, клиент: 1.2.3.4, сервер: example.com ; запрос: «GET / HTTP/1.1», восходящий поток: «fastcgi: //127.0.0.1:9000», хост: «example.com «

Я не смог выяснить, почему не отправляется код 50x. Я не настроил никаких параметров error_page и я прочитал документацию error_page. Я также попробовал установить код состояния (с error_page 500 = 500 /50x.html и так далее). Но всегда возвращается статус 200.

Я могу отправлять заголовки статуса с PHP ( header('HTTP/1.1 404 Not Found') ), это работает. Однако для ошибок, выданных интерпретатором PHP (также неперехваченных исключений), ответ сервера не учитывает, что произошла ошибка.

Комментарии:

1. Это способ, которым он реагирует на каждом веб-сервере, вы уверены, что хотите это сделать? Я имею в виду, что на самом деле это все равно бесполезно, ваш скрипт не должен завершаться сбоем, и во время разработки статус 200 подойдет, если вы можете прочитать ошибку .., если код состояния не равен 200, новые браузеры часто используют свою собственную страницу ошибок, поэтому вы не можете прочитать свою ошибку, что затруднило бы отладку

2. К сожалению, вы правы. Я только что заметил, что также mod_php отправляет статус 200 при ошибках PHP (ошибка синтаксического анализа, неперехваченные исключения). Это действительно скромно.. меня не волнует, как отлаживать ошибку (поскольку display_errors должен быть отключен в рабочей среде), но я действительно удивлен, что PHP делает это неправильным способом и выдает ошибки с кодами состояния «OK». Неудивительно, что Google полон сообщений об ошибках PHP.

3. Хорошо .. к счастью, это вызвано не PHP, а xdebug: bugs.php.net/bug.php?id=50921

Ответ №1:

К вашему сведению, теперь это исправлено в Xdebug (2.2) для PHP 5.4 и выше. К сожалению, для его работы потребовалось изменение в PHP, которое нельзя было перенести обратно на 5.3.