Назад | Перейти на главную страницу

Пользовательская страница ошибки 403 не отображается, если в URL-адресе есть подстановочные знаки

Я настраивал все страницы ошибок в моем проекте Apache. Вроде все было нормально, пока не появилась 403 Forbidden Error. Когда я отправляю подстановочный знак через URL-адрес (например, пробел или звездочку), настраиваемая страница ошибки не отображается.

http://localhost:8080/*

Если ошибка 403 вызвана другой причиной (например, доступ к запрещенному файлу), эта ошибка не появляется, и страница пользовательской ошибки загружается правильно. Мой код ".htaccess":

ErrorDocument 403 /index.php/%{REQUEST_URI}

У кого-нибудь такая же проблема? Как я могу это решить? Могу ли я отключить специальные символы, чтобы избежать этой ошибки? Любой ответ приветствуется.

Когда я отправляю подстановочный знак через URL-адрес (например, пробел или звездочку), настраиваемая страница ошибки не отображается.

В стороне: «Пустое место» - это не подстановочный знак символ, но если запрошенный URL-путь начинается с пространство (т.е. %20 при кодировке URL), то это действительно недопустимый запрос - см. №1 ниже.

Здесь есть две проблемы ...

  1. Apache вызовет ошибку 403 рано если есть определенные недопустимые символы (например, *, :, ") в URL-пути. В некотором смысле это зависит от ОС. Если символ не разрешен в именах файлов (в соответствии с базовой ОС), то при отображении запроса в файловую систему запускается 403.

  2. Это происходит перед .htaccess обрабатывается. Итак, если вы определите ErrorDocument поздно в .htaccess тогда ваш настраиваемый документ об ошибке не вызывается. Однако если вы определите ErrorDocument рано в конфигурации сервера (или VirtualHost), тогда это должен позвоните.


В стороне:

ErrorDocument 403 /index.php/%{REQUEST_URI}

Вам не нужно явно передавать запрошенный URL на ваш index.php сценарий. В PHP это доступно в $_SERVER['REDIRECT_URL'] суперглобальный из документа об ошибке.

Обратите внимание, что $_SERVER['REQUEST_URI'] PHP superglobal не обязательно то же самое, что и одноименный REQUEST_URI Переменная сервера Apache. Переменная PHP содержит строку запроса, а переменная Apache - нет.