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 遇到 <> 示例中的 true、匹配的情况时,它根本无法执行该指令集。然后,它会将页面发送到默认的 apache 403 错误页面,因为它在到达这些声明之前就退出了。您的 404 之所以有效,是因为它从未触发任何包含 L 条件(即最后执行的条件)的规则,因此到达了 htaccess 规则的底部。

我从来没有遇到过这种情况,因为我总是习惯性地将默认错误页面放在指令的顶部,以及其他核心内容,如 php ini 调整等。

重写内容放在底部。

目标是,当 Apache 遇到 L 情况进行重写或 htacess/config 规则结束时,您想要告诉 Apache 的所有内容都已告知 Apache。如果不是 htaccess,Apache 在开始为您的网站提供服务时就会知道所有规则,但使用 htacess,我相信它只会读取它们并执行文件告诉它的操作。

我相信这是正确的,但我不是 100% 确定,因为我总是把应该放在最上面的东西放在最上面,因此从未触发过你的案例。关键是要意识到 L(最后)确实意味着最后,然后还要知道 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 会容易得多。

相关内容