![URL 中的特殊字符导致自定义重定向失败](https://linux22.com/image/668421/URL%20%E4%B8%AD%E7%9A%84%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E5%AF%BC%E8%87%B4%E8%87%AA%E5%AE%9A%E4%B9%89%E9%87%8D%E5%AE%9A%E5%90%91%E5%A4%B1%E8%B4%A5.png)
我有一个域,我想在该域上为错误页面设置自定义重定向。
我的.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 会容易得多。