Специальные символы в 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 ошибочным страницам во всех условиях?

3
задан 14 October 2015 в 08:29
2 ответа
..

Я не уверен, зачем он это делает. Получил тот же номер с моей 403 страницей. Если вы хотите перенаправить конкретную 403-ю страницу, используйте следующее:

<Files some_thing> 
order Deny,Allow 
Deny from all 
</Files>
0
ответ дан 3 December 2019 в 08:03

Попробуйте перенести местоположение документа об ошибке в TOP вашего файла .htaccess. Я немного посмотрел на ваш пример, пытаясь разобраться в том, что происходит, а потом, наконец, понял, что вещь сказана выйти до того, как ей сказано, куда выходить в данном случае.

Apache читает директивы по порядку, и выходит в случае L. L неявно выражено в F:

При использовании [F] подразумевается [L] - то есть возвращается ответ немедленно, и никакие дальнейшие правила не оцениваются. https://httpd.apache.org/docs/2.4/rewrite/flags.html

Так что я предполагаю, что apache просто никогда не доберётся до этого набора инструкций, когда он попадёт в истинный, совпадающий, случай вашего примера <>. Который затем отправляет страницу на страницу ошибки по умолчанию apache 403, так как она вышла до того, как достигла этих объявлений. Ваш 404 сработал, потому что он никогда не запускал ни одно из правил, содержащих условие L, т.е. последнее, что нужно выполнить, и поэтому достиг дна правил htaccess.

Я никогда не попадал в эту ситуацию, потому что я всегда по привычке ставлю страницы с ошибками по умолчанию в TOP директивы, вместе с другими базовыми вещами, такими как настройки 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 в целом

.
0
ответ дан 3 December 2019 в 08:03

Теги

Похожие вопросы