Это должно быть проще всего, но по какой-то причине я просто не могу это сделать.
Я пытаюсь получить дружественную страницу статической ошибки, чтобы заменить неприятные 500 сценариев. На данный момент я просто пытаюсь воспроизвести ситуацию 500 на моей локальной машине (Drupal 7 работает на MAMP), добавив несколько дерьмовых символов в верхней части моего template.php в моей теме, которая вызывает ситуацию 500, но для по какой-то причине директива ErrorDocument в моем .htaccess
или конфигурационном файле Apache не имеет никакого эффекта.
То, что я делаю, довольно просто:
ErrorDocument 500 /500.html
И у меня есть самая простая из когда-либо статичных html-страниц в корне моего сайта с именем 500.html.
Тем не менее, когда я намеренно ломаю template.php, я получаю страшный Белый Экран Смерти вместо моей милой дружественной страницы с ошибкой.
Что я здесь не так делаю? Я делал это миллиард раз в настройках без Drupal, но просто не могу разобраться с этим.
ОБНОВЛЕНИЕ : кажется, что эти вопросы в значительной степени излишни в моем конкретном случае использования прямо сейчас, поскольку Dev Cloud от Acquia, который мы используем для запуска рассматриваемого приложения, даже не поддерживает настройку страниц ошибок серии 500 на данный момент. Мы надеемся, что скоро они осуществят поддержку.
источник
drupal_add_http_header('Status', '503 Service Unavailable');
в свой 500.html?Ответы:
500 страниц ошибок - это страницы ошибок сервера. Как только сервер передает выполнение PHP, Drupal / PHP отвечает за обслуживание своей собственной страницы ошибок. Вы можете попробовать сказать Drupal перенаправить пользователя на пользовательскую страницу ошибок вместе с заголовком состояния HTTP 500, когда он получает определенные ошибки в
try...catch
блоке.Однако обратите внимание, что некоторые WSOD могут возникать на системном уровне и могут привести к фатальной ошибке, которая немедленно останавливает выполнение и, возможно, мешает
catch
выполнению . Одним из примеров этого является ситуация, когда ваша база данных не настроена должным образом для обработки запросов определенного размера (например, при выполнении функций «Отменить все операции») - база данных может заглохнуть, давая вам insta-WSOD.Я бы сказал, что лучше всего проверить ваши журналы ошибок apache, MySQL и PHP и попытаться определить причину WSOD в каждом конкретном случае, а не пытаться скрыть их страница ошибки. В то время как ошибки, которые вызывают типичные 500 страниц с ошибками сервера, иногда неизбежны, и наличие пользовательских страниц с ошибками сервера в производстве возможно, наличие WSOD, происходящих вживую, - это не так.
Похоже, вы правильно настроили страницы ошибок сервера. Вам просто нужно различать типичные страницы ошибок сервера! = WSOD. Страницы с ошибками сервера могут быть вызваны из-за большого трафика и узких мест в ресурсах, но на самом деле не должно случиться, чтобы WSOD происходили в производстве. Обычно это происходит из-за плохого кодирования, оптимизации или конфигурации. Если вы все еще видите WSOD, убедитесь, что вы сначала нашли (и решили) основную причину проблемы, а не пытались наложить на нее лейкопластырь.
источник
Вы получаете WSOD, потому что вы отключили создание отчетов об ошибках в php.ini. Это проблема безопасности - если у вас есть ошибка, и хакер видит, что это такое, он может использовать ее для взлома сайта.
Если вы хотите перехватить ошибку, вам нужно включить отображение ошибок в php.ini (в примере будут показаны только серьезные ошибки):
Затем вы можете установить документы об ошибках в файле htaccess:
Кроме того, вы можете указать ошибки в файле settings.php Drupal .
В NGINX:
Поскольку вы используете Apache в MAMP, установите его в .htaccess. Помните, что
AllowOverride
в Apache конфиг должен быть включен (обычно так и есть).источник
ErrorDocument
директивы для 500 ответов в Drupal не работает в моем тестированииВы включили отчеты об ошибках? (admin / config / development / logging -> Установить все сообщения для отображения сообщений об ошибках )
По умолчанию Drupal показывает WSOD в качестве функции безопасности.
источник
Я думаю, что ответ "читать документы", см. Https://www.drupal.org/node/195435
Поэтому в основном вы можете создавать файлы шаблона с именем
maintenance-page.tpl.php
иmaintenance-page--offline.tpl.php
и жесткий код некоторые настройкиsettings.php
.РЕДАКТИРОВАТЬ:
Это , кажется, не имеет значения , какой уровень
error_reporting
установлен или вы установили лиdisplay_errors
вon
илиoff
. Когда у вас естьmaintenance-page--offline.tpl.php
файл, Drupal отобразит эту страницу, когда база данных исчезнет. Также не имеет значения, что вы установили на/admin/config/development/logging
стороне администратора. Если у вас просто есть синтаксические ошибки, которые были в ситуации с OP, то это фактически не вызывает 500, это 200 с ошибкой PHP, отображаемой или скрытой в зависимости отphp.ini
display_error
набора. Я знаю, что нет другого способа, кроме как добавлять вашу собственную логику обработки ошибок в ваш собственный код по мере необходимости.источник
Чтобы заменить все WSOD чем-то другим, потребуется взлом ядра: вы не хотите этого делать. Drupal определяет свои собственные обработчики ошибок в bootstrap.inc и errors.inc. Если бы вы возились с этим кодом, вам нужно было бы убедиться, что вы учли все вещи, которые могли быть неправильными, когда выполнение достигло этой стадии (без базы данных, без механизма тем, без темы, без конфигурации и т. Д.).
источник
Я сделал проект песочницы, чтобы сделать это.
Я смог сделать это, расширив HttpExceptionSubscriberBase в /src/EventSubscriber/fivehundredEventSubscriber.php
И вам нужно будет добавить сервис в свой module.services.yml
источник