Специальные символы в URL-адресе приводят к сбою пользовательского перенаправления

Специальные символы в URL-адресе приводят к сбою пользовательского перенаправления

У меня есть домен, на котором я пытаюсь настроить пользовательские перенаправления для страниц ошибок.
Мой .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 при любых условиях?

решение1

Не уверен, почему это происходит. У меня та же проблема со страницей 403. Если вы хотите перенаправить определенную страницу 403, используйте это:

<Files some_thing> 
order Deny,Allow 
Deny from all 
</Files>

решение2

Попробуйте переместить местоположения документов с ошибками в ВЕРХ вашего файла .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 в целом.

Связанный контент