Пользовательская страница ошибки 401 cPanel не отображается

Моя проблема:

По какой-то причине моя пользовательская страница ошибки 401 не отображается при входе в систему, а просто отображает общую страницу ошибки 401:

Unauthorized

This server could not verify that you are authorized to access the document requested. 
Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't 
understand how to supply the credentials required.

Additionally, a 401 Unauthorized error was encountered while trying to use an 
ErrorDocument to handle the request.

Теперь, говоря об этом, моя пользовательская страница ошибки 404 и другие отображаются просто отлично, но не для 401. Файл error.php (пользовательская страница ошибки) находится в моем каталоге public_html.

Мой текущий файл .htaccess в каталоге public_html:

ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
ErrorDocument 501 /error.php
ErrorDocument 502 /error.php
ErrorDocument 503 /error.php
ErrorDocument 504 /error.php
ErrorDocument 505 /error.php
ErrorDocument 506 /error.php
ErrorDocument 507 /error.php
ErrorDocument 510 /error.php

RewriteEngine On

DirectoryIndex .index.php .style.css .sorttable

RewriteRule .*\.(jpg|jpeg|gif|png|bmp|zip|rar)$ - [F,NC]

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php73” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php73 .php .php7 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit


#----------------------------------------------------------------cp:ppd
# Section managed by cPanel: Password Protected Directories     -cp:ppd
# - Do not edit this section of the htaccess file!              -cp:ppd
#----------------------------------------------------------------cp:ppd
AuthType Basic
AuthName "Protected 'public_html'"
AuthUserFile "/home/dark/.htpasswds/public_html/passwd"
Require valid-user
#----------------------------------------------------------------cp:ppd
# End section managed by cPanel: Password Protected Directories -cp:ppd
#----------------------------------------------------------------cp:ppd

Теперь мои каталоги защищены паролем, как вы можете видеть в файле .htaccess. Я попробовал следующие исправления, но все равно не удалось отобразить пользовательскую страницу ошибки 401:

  1. Создал страницу ошибки в другом каталоге.
  2. Указан полный адрес страницы ошибки в файле .htaccess.
  3. Отключена функция пароля каталога.
  4. Изменено расширение файла ошибки на .shtml.
  5. Пробовал много других кодов и вопросов на сайте stackoverflow.

Теперь, чтобы резюмировать, все другие пользовательские страницы ошибок отображаются нормально, только не 401 при входе в систему, и я в тупике.

Информация о моем сервере cPanel:

Hosting Package Gold
Server Name server
cPanel Version  88.0 (build 14)
Apache Version  2.4.46
PHP Version 7.3.21
MySQL Version   10.3.24-MariaDB-cll-lve
Architecture    x86_64
Operating System    linux
Shared IP Address   45.95
Local IP Address    192.168
Path to Sendmail    /usr/sbin/sendmail
Path to Perl    /usr/bin/perl
Perl Version    5.16.3
Kernel Version  3.10.0-962.3.2.lve1.5.32.el7.x86_64

Спасибо!


person Brandon Humphrey    schedule 16.11.2020    source источник
comment
3. Отключена функция пароля каталога. - Как тогда вы пытались запустить 401? Это должно было позволить вам получить доступ к 401 ErrorDocument.   -  person MrWhite    schedule 16.11.2020
comment
Я имел в виду, что я отключил приватность каталога для ‹public_html› и попытался получить доступ к ‹var›, который все еще был защищен. Я думал, что ‹public_html›, защищенный паролем, блокирует отображение пользовательской страницы ошибок. Однако это не сработало.   -  person Brandon Humphrey    schedule 16.11.2020
comment
Хорошо, это должно было сработать. Убедитесь, что вы очистили кеш браузера.   -  person MrWhite    schedule 16.11.2020
comment
Я сделал и использовал несколько браузеров на разных устройствах.   -  person Brandon Humphrey    schedule 16.11.2020


Ответы (1)


Для обслуживания 401 ErrorDocument он должен быть доступен. Если все заблокировано HTTP-аутентификацией, то она не будет доступна при сбое аутентификации, и вы получите дополнительную часть в ответе сервера 401 по умолчанию:

Кроме того, при попытке использовать ErrorDocument для обработки запроса произошла ошибка 401 Unauthorized.

Вам нужно пробить дыру в вашей аутентификации и разрешить публичный доступ к этому документу.

Например:

<Files "error.php">
    Require all granted
</Files>
  1. Создал страницу ошибки в другом каталоге.

Это должно было сработать, при условии, что другой каталог также не был защищен HTTP-аутентификацией. Например, подкаталог не поможет.

  1. Указан полный адрес страницы ошибки в файле .htaccess.

Это вызовет внешнее перенаправление 302 и потеряет ответ 401. Это не разрешено. Как указано в документах Apache :

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

  1. Отключена функция пароля каталога.

Если вы отключили функцию пароля каталога, то нет ничего, что могло бы вызвать 401, поэтому ваш документ об ошибке был бы доступен, но тогда как вы запускаете / тестируете свой документ об ошибке 401? Это кажется немного курицей/яйцом.

  1. Изменено расширение файла ошибки на .shtml.

Изменение типа файла здесь ничего не изменит.

RewriteRule .*\.(jpg|jpeg|gif|png|bmp|zip|rar)$ - [F,NC]

Чтобы уточнить, вы не размещаете изображения на каких-либо страницах? Любой запрос, содержащий одно из этих расширений файла, вызовет ошибку 403 Forbidden.


ОБНОВЛЕНИЕ: если ваши документы об ошибках используют дополнительные ресурсы, то было бы проще, если бы все они содержались в собственном подкаталоге (например, /errordocs) — тогда вы можете просто разрешить публичный доступ к этому подкаталогу без для идентификации каждого файла.

Затем вы создаете дополнительный файл .htaccess в подкаталоге /errordocs всего одной строкой:

Require all granted
person MrWhite    schedule 16.11.2020
comment
‹Files error.php› Требовать все предоставленные ‹/Files› Кажется, сработало, но похоже, что на странице ничего не загружено из-за того, что папка ‹images› не включена. Однако я могу щелкнуть гиперссылки на отсутствующих изображениях. Как бы вы добавили несколько файлов в теги ‹/Files›, чтобы изображения загружались? - person Brandon Humphrey; 16.11.2020
comment
Да, изображения и любые другие внешние ресурсы (CSS, JS и т. д.), естественно, также будут заблокированы. Но также (как отмечалось выше) вы все равно блокируете все локальные изображения своей директивой RewriteRule? Если ваши документы об ошибках используют дополнительные ресурсы, то было бы проще, если бы все они содержались в своих собственных подкаталогах — тогда вы можете просто разрешить публичный доступ к этому подкаталогу без необходимости идентифицировать каждый файл. Я обновлю свой ответ. - person MrWhite; 16.11.2020
comment
Я добавил несколько тегов ‹File›‹/Files› в .htaccess, чтобы загрузить основные 4 файла. Это сработало, большое спасибо MrWhite! - person Brandon Humphrey; 16.11.2020
comment
Пожалуйста. Если для доступа к файлам есть шаблон, вы можете использовать контейнер <FilesMatch> вместо этого, который дает вам совпадение с регулярным выражением. Контейнер <Files> имеет только базовое соответствие wildcard. - person MrWhite; 16.11.2020