#1455 closed улучшение (готово)
Ответ сервера "500 Internal server error" не имеет тела
| Reported by: | alx | Owned by: | Denis_N |
|---|---|---|---|
| Priority: | major | Component: | БД изделий АДС |
| Keywords: | Cc: |
Description
При попытке запроса главной страницы от сервера пришел ответ "500 Internal server error". Однако у этого ответа не было тела, в результате чего у меня в браузере отобразилась пустая страница, и о том, что на сервере произошла ошибка, я узнал только когда открыл консоль браузера, что я догадался сделать далеко не сразу...
Чтобы сразу дать понять пользователю, что что-то пошло не так, предлагаю сопровождать ответы сервера "500 Internal server error" (и другие неуспешные ответы 4XX/5XX) краткими человеко-читаемыми страничками (хотя бы из одной строчки, повторяющей статус ответа).
PS. Описанный инцидент произошел с r478/base.
Change History (3)
comment:2 by , 7 days ago
Перепроверил ситуацию по r478/base.
По нашей части проблема относилась к AJAX-загрузке данных Главной страницы: таблица загружалась через backend/main_backend.php, а js/main.js в r478/base обрабатывал только успешный ответ. Если backend возвращал HTTP 500, пользователь мог увидеть пустой результат, а сама ошибка была заметна только в консоли/Network браузера.
Исправлено в коде:
- r498/base: backend/main_backend.php стал отдавать JSON с заголовком Content-Type: application/json; charset=utf-8; обработка запросов обёрнута в try/catch, при ошибке возвращается HTTP 500 с JSON-ответом {"error": "..."}.
- r580/base: на Главной добавлены обработчики неуспешных AJAX-запросов при загрузке данных.
- r587/base: добавлены состояния ошибки для списка изделий и журнала событий, чтобы ошибка загрузки отображалась в интерфейсе.
- r610/base: сообщение «Ошибка загрузки» выводится непосредственно в таблице/журнале.
То есть для AJAX-запросов Главной страницы сейчас ошибка не должна приводить к молчаливо пустому результату: backend возвращает понятный ответ, а frontend показывает сообщение пользователю.
Отдельный случай, когда HTTP 500 возникает при загрузке самого HTML-документа до запуска JavaScript, относится уже к общей настройке веб-сервера/окружения и не исправляется обработчиком AJAX на стороне Главной страницы.
comment:3 by , 7 days ago
| Resolution: | → готово |
|---|---|
| Status: | new → closed |
Закрываю тикет, как исправленный с моей стороны.
Для настройки веб-сервера создал тикет для san #1509
![[MC-04 logo]](/mc-04/chrome/site/logo.png)
Проблема относится не столько к коду main.php, сколько к настройке обработки ошибок на веб-сервере.
Для AJAX/backend-запросов часть обработчиков уже возвращает тело ответа: например backend/main_backend.php при перехваченной ошибке отдаёт HTTP 500 и JSON с текстом ошибки.
Но если ошибка возникает при обычном открытии страницы и выполнение PHP аварийно прерывается до формирования HTML, то тело ответа формирует уже веб-сервер. Чтобы пользователь не видел пустую страницу, нужно настроить ErrorDocument для 4xx/5xx на уровне Apache.
В локальной конфигурации Apache есть готовый файл:
conf/extra/httpd-multilang-errordoc.conf
В нём описаны страницы ошибок, включая 500 Internal Server Error, но подключение этого конфига в httpd.conf может быть отключено.
У меня нет доступа к настройкам рабочего сервера, поэтому эту часть должен проверить и настроить администратор сервера, в данном случае Саша