Ошибка 500 (Internal Server Error) значит одно: сервер принял запрос и сломался, пока его выполнял. В отличие от 502 и 504, здесь нет посредника, который не дождался ответа. Поломался сам код сайта или настройки сервера.
Мы собрали стенд и сломали на нём PHP, Apache, nginx и WordPress двенадцатью способами. Смотрели, какой код получает посетитель, что пишется в журнал и когда поломка прячется за кодом 200. Затем обошли 260 сайтов компаний Екатеринбурга тремя неудобными, но безобидными адресами и проверили, падает ли от них хоть кто-нибудь.
Что говорит определение
Стандарт HTTP (RFC 9110, раздел 15.6.1) определяет 500 так: сервер, в нашем переводе, «столкнулся с непредвиденным условием, которое помешало ему выполнить запрос». Это самый общий код ошибки сервера: его отдают, когда более точного ответа нет.
Справочник кодов в Яндекс Вебмастере говорит то же и советует разработчику: «Проверьте логи сервера для выявления причин ошибки». Этот совет — главное в статье. Страница 500 почти никогда не говорит, что случилось, а журнал говорит всегда.
Стенд: какие поломки дают 500
Стенд — PHP 8.3 под Apache из официального образа WordPress, nginx 1.22.1 перед ним и отдельный WordPress 7 без базы данных. Вывод ошибок PHP выключен, как и положено на рабочем сайте.
| Поломка | Код | Что видит посетитель |
|---|---|---|
| Вызов несуществующей функции | 500 | пустую страницу, 0 байт |
| Необработанное исключение | 500 | пустую страницу |
| Синтаксическая ошибка в PHP | 500 | пустую страницу |
| Не хватило памяти (memory_limit) | 500 | пустую страницу |
| Превышено время выполнения | 500 | пустую страницу через 2 с |
| Нет драйвера базы данных | 500 | пустую страницу |
| Код сам отдал 500 | 500 | свой текст |
| Опечатка в .htaccess | 500 | стандартную страницу Apache |
| Бесконечный rewrite в nginx | 500 | стандартную страницу nginx |
| try_files ссылается сам на себя | 500 | стандартную страницу nginx |
| WordPress не достучался до базы | 500 | «Error establishing a database connection» |
| Ошибка PHP после начала вывода | 200 | обрезанную страницу |
Одиннадцать поломок честно отдали 500. Шесть из них выглядят для посетителя одинаково — белый экран без единого байта. Отличить нехватку памяти от синтаксической ошибки можно только по журналу:
PHP Fatal error: Allowed memory size of 16777216 bytes exhausted;PHP Fatal error: Maximum execution time of 2 seconds exceeded;PHP Parse error: syntax error, unexpected end of file;Invalid command 'Redirec', perhaps misspelled— это Apache про .htaccess;rewrite or internal redirection cycle— это nginx про зацикленные правила.
Двенадцатая поломка — самая коварная. Страница каталога начала
отправляться, и на середине PHP упал. Заголовок с кодом 200 к этому
моменту уже ушёл, поэтому сервер отдал 200 и 34 КБ страницы без конца.
В журнале — та же PHP Fatal error, в ответе — «всё хорошо».
Когда 500 превращается в 200
Затем мы включили вывод ошибок (display_errors = On) — так часто
оставляют после отладки или на дешёвом хостинге по умолчанию.
Результат: все семь PHP-поломок отдали код 200. На странице вместо
содержимого — текст вроде Fatal error: Uncaught Error: Call to undefined function … in /var/www/html/fatal.php:1 с полным путём к файлу на
сервере.
Для сайта это двойная беда:
- робот поиска получает 200 и может проиндексировать текст ошибки как обычную страницу. Google о таком случае пишет: если «появляется пустая страница или сообщение об ошибке, в Search Console будет зарегистрирована ошибка soft 404»;
- посторонний видит пути к файлам, имена функций и иногда строки подключения к базе.
Мониторинг, который проверяет только код ответа, такую поломку не заметит. Проверка должна искать на странице строку, которая там обязана быть: номер телефона, название компании, закрывающий блок подвала.
Красивая страница ошибки не меняет код
Часто 500 прячут за своей страницей «Ведутся технические работы». На
стенде мы настроили в nginx error_page 500 /krasivo.html — посетитель
увидел текст, а код остался 500. Код меняется только явным указанием:
error_page 500 =503 /krasivo.html отдал 503.
Разница важна для поиска. 503 означает «временно», и роботы относятся к нему мягче. Если сайт на плановых работах — отдавайте 503. Если упал код — 500 честнее, чем 200 с заглушкой.
Посредник код не меняет. Когда nginx стоит перед приложением, он пропускает 500 от приложения как есть: на стенде ответ через nginx совпал с ответом Apache байт в байт.
Что показал обход 260 сайтов
Обход 24.09.2026: к каждому сайту четыре запроса — главная и три неудобных адреса, которые обычный сайт должен пережить:
/?a=%— оборванная кодировка в параметре;/?s[]=1— параметр-массив вместо строки;/%— оборванная кодировка в пути.
Главная ответила 200 у 212 сайтов, ещё 15 не ответили вовсе. Дальше считали только живые 212.
| Запрос | 200 | 3xx | 400 | 500 |
|---|---|---|---|---|
/?a=% | 171 | 39 | 2 | 0 |
/?s[]=1 | 204 | 7 | 0 | 1 |
/% | 1 | 0 | 208 | 1 |
В последней строке ещё один сайт ответил 404 и один промолчал.
Ошибка 500 — у двух сайтов из 212. У первого параметр-массив в поиске уронил страницу, и сайт показал сообщение о «критической ошибке». Второй отдал голый 500 на оборванную кодировку в пути, где остальные 208 ответили 400.
Вывод: одним разовым обходом 500 почти не ловится. Как и 502, это ошибка минут и отдельных страниц, а не постоянное состояние сайта. Узнать о ней можно из журнала сервера и из статистики обхода в Вебмастере, но не случайной проверкой главной.
Что проверить до звонка разработчику
Пять шагов, для которых не нужен доступ к коду.
- Весь сайт или одна страница. Откройте главную, одну статью и страницу из другого раздела. Падает одна страница — виноват её шаблон или модуль. Падает всё — общие настройки, база или хостинг.
- Код ответа. Команда
curl -I https://сайт/или проверка доступности покажут, 500 это на самом деле или страница с ошибкой и кодом 200. - Что менялось. Обновление плагина, темы, версии PHP, правка .htaccess за последние сутки — первый подозреваемый. На стенде опечатка в одном слове .htaccess уронила всю папку сайта.
- Журнал ошибок. В панели хостинга он обычно называется
«Журнал ошибок» или error.log. Последние строки с
Fatal error,memoryили.htaccessотвечают на вопрос «что сломалось» точнее любой догадки. - Лимиты тарифа. Если в журнале строка
Allowed memory size, сайту не хватило памяти. Лимит часто поднимается в панели хостинга, без разработчика.
Разработчику передайте адрес страницы, время ошибки и строку из журнала. С этим он найдёт причину за минуты, без этого — начнёт с тех же пяти шагов.
Что 500 значит для поиска
Справка Google описывает 500 прямо: робот «снижает частоту сканирования сайта. Она уменьшается пропорционально количеству отдельных URL, которые возвращают ошибку сервера». И дальше: «URL, которые постоянно возвращают такую ошибку, удаляются из индекса».
Отдельно опасен 500 на robots.txt. По справке Google робот в этом случае «не сканирует сайт на протяжении первых 12 часов». Падение одного служебного файла на полдня останавливает обход всего сайта.
Справка Вебмастера Яндекса: страница с кодом, отличным от 200, «недоступна для роботов и посетителей и не может попасть в поиск». Короткая разовая ошибка это не запустит — робот вернётся. Опасна повторяющаяся, например каждую ночь во время резервного копирования.
Чего мы проверить не смогли
- Выводят ли сайты из обхода тексты ошибок посетителям. Для этого пришлось бы специально провоцировать ошибки на чужих сайтах и разглядывать ответы — это уже не проверка, а разведка, и мы её не делали.
- PHP-FPM за nginx. Стенд собран на PHP под Apache. По устройству FPM отдаёт тот же статус, но отдельно мы это не мерили.
- Как быстро робот Яндекса убирает страницу, которая отдаёт 500. Для этого нужно ломать свою проиндексированную страницу на недели.
Границы замера
- Стенд — один набор версий: PHP 8.3, Apache из образа WordPress 7, nginx 1.22.1. На других версиях поведение в мелочах может отличаться.
- Обход — 260 сайтов компаний Екатеринбурга, по четыре запроса на сайт, один раз, 24.09.2026. Разовый обход не видит ошибок, которые случаются в другое время.
- Имена сайтов с ошибками мы не называем: это компании, а не учебные примеры.
Коротко
- 500 значит: сломался сам сервер или код сайта, а не посредник.
- Шесть разных PHP-поломок выглядят одинаково — белый экран. Различает их только журнал ошибок.
- Со включённым выводом ошибок все семь PHP-поломок отдали 200 с текстом ошибки. Проверяйте содержимое страницы, а не только код.
- Своя страница ошибки код не меняет: для плановых работ нужен явный 503.
- Из 212 живых сайтов неудобные адреса уронили два.
- Google урезает обход при 500 и удаляет постоянно падающие адреса; 500 на robots.txt останавливает обход на 12 часов.
