Apache ErrorDocument для ошибки 500 не работает

Я знаю, что это может быть дубликат, но у меня есть более подробные сведения. У меня есть файл .htaccess, настроенный для отображения пользовательской страницы ошибок для наиболее распространенных ошибок:

  # remove .php
    RewriteEngine On 
    RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
    RewriteRule ^ /%1 [NC,L,R]
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^ %{REQUEST_URI}.php [NC,L]
    #Add custom error pages
    ErrorDocument 404 /errors/404
    ErrorDocument 403 /errors/403
    ErrorDocument 500 /errors/500

Когда я намеренно запускаю ошибку 500, он просто дает мне для этого страницу Apache по умолчанию, а также говорит: Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request. Я могу получить доступ к странице с ошибкой, набрав localhost/errors/500, так что это не проблема с разрешениями. Перерыл много форумов, но решения не нашел.

Редактировать: Ошибка 500 была вызвана искаженным запросом модуля перезаписи. Если вы наберете example.com/index/, он попытается перейти на /index/.php, и это вызовет ошибку 500.

Как вы «преднамеренно вызываете ошибку 500»?

MrWhite 24.01.2019 20:01

www.mydomain.com/index/ выдает ошибку из-за механизма перезаписи

user10833006 24.01.2019 21:31

Я запустил один в PHP. Я случайно удалил блок catch и оставил try. Вуаля хороший тестовый материал. Проблема в том, что я могу заставить 404 работать нормально, но не 500, что кажется довольно распространенным явлением.

BeNice 07.07.2019 17:27
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
3
1 666
1

Ответы 1

Внутренняя ошибка сервера 500 — очень распространенная ошибка. Это указывает на то, что сервер обнаружил ошибку серьезный и просто не может обработать запрос в обычном режиме.

Многие из этих 500 ошибок просто не могут быть обнаружены с помощью пользовательского документа об ошибке, определенного как «поздний» в .htaccess.

У вас больше шансов, если ErrorDocument определен в конфигурации сервера. Но даже этого будет недостаточно скоро для некоторых ошибок.

Однако, сказав это...

...and also says: Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request. I can access the error page by typing localhost/errors/500 so its not with the permissions.

Edit: The error 500 was triggered from a malformed request by the rewrite engine. If you type example.com/index/ it tried to go to /index/.php and that caused error 500

Похоже, что пытающийся служит для обслуживания пользовательского документа об ошибке (500), но это также приводит к ошибке 500.

В частности, запрос /index/ приводит к циклу перезаписи, т.е. /index/.php на /index/.php.php на /index/.php.php.php и т. д. Когда сервер достигает предела для внутренних перенаправлений (по умолчанию 10), он вызывает ошибку 500.

Да, я вижу это и для переписать петли. Несмотря на то, что ошибка не мешает обслуживанию ErrorDocument; сообщение, кажется, предполагает, что это так. Запрос документа об ошибке напрямую допустим.

Интересно (чисто гипотетически)... поскольку в этом запросе достигнут предел "внутренних перенаправлений" (из-за цикла перезаписи), ErrorDocument (который также обслуживается внутренним перенаправлением) не может быть обслужен, потому что этот предел уже достигнуто!? Таким образом, это вызывает ошибку 500 по той же причине! Строго говоря, ErrorDocument обслуживается через внутренний подзапрос (не внутреннее перенаправление), хотя Документация Apache для директивы LimitInternalRecursion, похоже, объединяет «внутренние перенаправления» и «подзапросы».

Я не могу просто придумать другой способ вызвать ошибку 500, кроме запуска ее в коде (как показано ниже - что работает нормально). Любой (фатальный) синтаксический анализ ошибок в коде вызывает ошибку 500 по запросу каждый.

RewriteRule ^foo$ - [R=500]

Вышеприведенное должно обслуживать ваш пользовательский 500 ErrorDocument как обычно, сам ErrorDocument в порядке.

Сначала я определил его в .htaccess. Все еще не работает.

user10833006 24.01.2019 21:34

Когда я говорю «поздно в .htaccess», я имею в виду, что сам .htaccess обрабатывается слишком поздно, независимо от того, где вы на самом деле поместили директиву в .htaccess. Обрабатывается основной конфиг сервера до.htaccess (на самом деле он обрабатывается при первом запуске сервера)

MrWhite 24.01.2019 22:07

Ах да, я вижу, что вы сейчас говорите о дополнительном сообщении относительно обслуживания ErrorDocument. Я обновил свой ответ.

MrWhite 25.01.2019 01:25

Можете ли вы объяснить строку, которую вы разместили. Что я должен положить в foo?

user10833006 25.01.2019 14:35

Это всего лишь способ запустить (т.е. протестировать) ваш собственный 500 ErrorDocument. Если вы запрашиваете /foo (он не обязательно должен существовать), вы должны увидеть свой собственный файл 500 ErrorDocument.

MrWhite 25.01.2019 14:39

Что мне нужно сделать, чтобы страница с ошибкой 500 отображалась, если кто-то вводит /index/

user10833006 25.01.2019 14:44

К сожалению, я не думаю, что вы можете (согласно моему «гипотетическому» объяснению выше). Однако ввод этого URL-адреса никогда не должен вызывать ошибку 500 — вам нужно исправить свой код. Конечный пользователь никогда не должен видеть ошибку 500 при нормальном использовании. Вам нужно исправить ваши директивы mod_rewrite, чтобы /index/ не запускал цикл перезаписи (это другая проблема).

MrWhite 25.01.2019 16:31

Другие вопросы по теме