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

ErrorDocument 400 перенаправляет на другой URL без перезаписи

Я хочу реализовать на своем веб-сайте настраиваемую страницу с ошибкой 400 tikolu.net, в файл с именем 400.php в папке с названием error.

Первым делом я попытался просто разместить ErrorDocument 400 /error/400.php в мой .htaccess файл. Это не работает, потому что ошибки типа 400 не могут быть обработаны .htaccess файл и вместо этого должен быть помещен в httpd.conf файл, как уже упоминалось Вот.

Это работает в смысле признания Apache, но все еще не работает полностью. По-прежнему отображается сообщение по умолчанию, но на этот раз с добавлением внизу: Additionally, a 400 Bad Request error was encountered while trying to use an ErrorDocument to handle the request.

Это потому что ErrorDocument не перенаправляет, а просто перезаписывает URL-адрес, а теперь пытается показать 400.php. Но поскольку это всего лишь переписывание, Apache по-прежнему считает, что запрошенный документ был тем же документом, который изначально вызвал ошибку, поэтому снова возникает ошибка 400.

Самое большее, что мне удалось сделать, это вместо этого сказать ErrorDocument 400 https://tikolu.net/error/400.php. Это работает, потому что Apache не может снова перезаписать URL-адрес (поскольку он является внешним) и вынужден перенаправить. Однако для меня это не сработает, поскольку мне нужно знать исходный URL-адрес, который вызвал ошибку. Я пытался получить $_SERVER["HTTP_REFERER"] из PHP, но он пуст.

В ErrorDocument директива имеет доступ к некоторым переменные, лайк REDIRECT_URL но они устанавливаются только в том случае, если цель является внутренней, поэтому в этом случае это не сработает.

Есть ли возможность использовать ErrorDocument но с правильным перенаправлением, чтобы его можно было обработать сценарием PHP без повторения ошибки? Если нет, есть ли способ использовать переменные директивы при перенаправлении во внешнее расположение?


Вот содержание моего .htaccess файл:

RewriteEngine On
IndexOptions +Charset=UTF-8

# REMOVE www FROM URL
<If "%{HTTP_HOST} == 'www.tikolu.net'">
    RedirectMatch (.*) https://tikolu.net$1
</If>

# REDIRECT HTTP TO HTTPS
<If "%{HTTPS} == 'off'">
    RedirectMatch (.*) https://tikolu.net$1
</If>

# BLOCK .listing FILE
<Files ~ "\.listing$">
    Require all denied
</Files>

# DIRECTORY INDEXES
DirectoryIndex index.php index.html

# ERROR DOCUMENTS
ErrorDocument 404 /error/404.php
ErrorDocument 403 /error/403.php

# REDIRECTS

(далее следуют различные перенаправления, все в форме RewriteRule location$ /destination [L])

Я отключил свой .htaccess файл временно (переименовав его), и проблема все еще остается.


РЕДАКТИРОВАТЬ: Мне удалось найти немного хакерский (но рабочий) обходной путь:

ErrorDocument 400 '<meta http-equiv="refresh" content="0; URL=/error/400.php">'