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 遇到 L 情況進行重寫或 htacess/config 規則結束時,您想要告訴 apache 的所有內容都已被告知給 apache。如果不是 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 會比較容易。

相關內容