Opened 4 months ago

Closed 7 days ago

Last modified 7 days ago

#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:1 by Denis_N, 7 days ago

Проблема относится не столько к коду 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 может быть отключено.

У меня нет доступа к настройкам рабочего сервера, поэтому эту часть должен проверить и настроить администратор сервера, в данном случае Саша

Version 0, edited 7 days ago by Denis_N (next)

comment:2 by Denis_N, 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 Denis_N, 7 days ago

Resolution: готово
Status: newclosed

Закрываю тикет, как исправленный с моей стороны.
Для настройки веб-сервера создал тикет для san #1509

Last edited 7 days ago by Denis_N (previous) (diff)
Note: See TracTickets for help on using tickets.