У меня есть домен, в котором я пытаюсь настроить переадресацию для страниц с ошибками.
Мой .htaccess
файл выглядит так:
RewriteEngine On
AddDefaultCharset UTF-8
DefaultLanguage en-US
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]
Options All -Indexes
ServerSignature Off
<ifModule mod_headers.c>
Header unset X-Powered-By
</ifModule>
<Files .htaccess>
order allow,deny
deny from all
</Files>
<IfModule php5_module>
php_value session.cookie_httponly true
#php_value session.cookie_secure true
</IfModule>
RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css' files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
#Error page handeller
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php
Когда я печатаю что-то в URL-адресе, например:
example.com/aboutUs
: Все нормально работает. example.com/xxygsds
: URL-адрес перенаправляется на настраиваемую страницу ошибки 404. example.com/<>
: Это перенаправляет на запрещенную страницу 403. Однако перенаправление на apache/error/HTTP_FORBIDDEN.html.var
страницу, а не на настраиваемую страницу, как указано выше. Мои вопросы:
1. Почему происходит перенаправление?
2. Как я могу сделать так, чтобы он перенаправлял на пользовательскую страницу ошибки 403 при любых условиях?
Попробуйте переместить расположение документа с ошибкой в начало файла .htaccess. Некоторое время я смотрел на ваш пример, пытаясь понять, что происходит, затем, наконец, понял, что объекту приказывают выйти, прежде чем сообщается, куда в этом случае нужно выйти.
Apache читает директивы по порядку и завершает работу в случае L. L неявно присутствует в F:
При использовании [F] подразумевается [L] - то есть ответ возвращается немедленно, и никакие другие правила не оцениваются. https://httpd.apache.org/docs/2.4/rewrite/flags.html
Итак, я предполагаю, что apache просто никогда не доберется до этого набора инструкций, когда он попадает в истинный, соответствующий, случай вашего примера <>. Затем страница отправляется на страницу ошибки apache 403 по умолчанию, поскольку она завершилась до того, как достигла этих объявлений. Ваш 404 работал, потому что он никогда не запускал ни одно из правил, содержащих условие L, т. Е. Последнее, что нужно выполнить, и, таким образом, достиг нижней части правил htaccess.
Я никогда не сталкивался с этой ситуацией, потому что по привычке я всегда помещаю страницы ошибок по умолчанию в ТОП директивы вместе с другими основными вещами, такими как корректировки php ini и т.
Переписанные снизу.
Цель состоит в том, чтобы все, что вы хотели сообщить apache, было передано apache к тому моменту, когда он попадет в регистр L для перезаписи или к концу правил htacess / config. Если бы это был не htaccess, apache знал бы все правила, когда начал обслуживать ваш сайт, но с htacess, я считаю, он просто читает их и делает то, что ему сообщает файл.
Я считаю, что это правильно, но я не уверен на 100%, поскольку я всегда помещал то, что должно быть сверху, и таким образом никогда не приводил в действие ваше дело. Ключ в том, чтобы понять, что L, Last, действительно означает Last, а затем также знать, что F подразумевает L.
В общем, при работе с конфигурациями apache стоит быть организованным:
# top generics etc
#Error page handler
ErrorDocument 400 /htaccessSample/errordocs/error-code.php
ErrorDocument 401 /htaccessSample/errordocs/error-code.php
ErrorDocument 403 /htaccessSample/errordocs/error-code.php
ErrorDocument 404 /htaccessSample/errordocs/error-code.php
AddDefaultCharset UTF-8
DefaultLanguage en-US
# Disable Directory Browsing, not related to rewrite
Options All -Indexes
# Secure directories by disabling execution of scripts
AddHandler .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
ServerSignature Off
<ifModule mod_headers.c>
Header unset X-Powered-By
</ifModule>
<IfModule php5_module>
php_value session.cookie_httponly true
#php_value session.cookie_secure true
</IfModule>
<Files .htaccess>
order allow,deny
deny from all
</Files>
## NOW do the set of rewrite rules, everything that apache needs to
## know has been told to it by this point
RewriteEngine On
# disable TRACK and TRACE http methods. 'RewriteEngine On' is required!
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS|HEAD|PUT|DELETE)
RewriteRule .* - [F]
RewriteCond %{QUERY_STRING} _escaped_fragment_=(.*)
#to block all links to '.gif', '.jpg','.js' and '.css' files which are not from the domain name 'http://www.example.com/'
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example.com/.*$ [NC]
RewriteRule \.(gif|jpg|css|js)$ - [F]
#to deny requests containing invalid characters
RewriteBase /
RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ [a-zA-Z0-9\.\+_/\-\?\=\&]+\ HTTP/ [NC]
RewriteRule .* - [F,NS,L]
Не забывайте всегда добавлять новую строку / разрыв строки в конце файла .htaccess. Ваша версия чрезвычайно случайна и неорганизована, что, на мой взгляд, является реальной причиной ваших проблем: если вы просто привыкнете четко и последовательно упорядочивать свои правила (то есть, переписывание не смешивается с другими правилами), вы обнаружите, что это в целом работать с Apache намного проще.
Я не уверен, почему это так. Получил ту же проблему с моей страницей 403. Если вы хотите перенаправить определенную страницу 403, используйте это:
<Files some_thing>
order Deny,Allow
Deny from all
</Files>