Apache重定向


apache的重定向主要是用RewriteCond及RewriteRule來完成,前者用於判斷匹配條件,條件符合的將會轉到下一條的Rewrite進行處理。

先看一個例子

#打開重寫模塊
RewriteEngine On

#定義重寫的基准路徑
RewriteBase /

#定義判斷,若"%{http_host}"=="dmesg.top",則繼續執行下面的RewriteRule
RewriteCond %{http_host} ^dmesg.top$ [NC]

#定義重寫規則,將所有訪問dmesg.top中的請求重定向到www.dmesg.top的相同路徑
RewriteRule ^(.*)$ www.dmesg.top/$1 [R=301]

RewriteCond

語法

RewriteCond String Pattern [flags]

定義一個條件,當String所規定的內容與Pattern規則匹配時,才會執行RewriteRule規定重寫。

string

(1)$N:RewriteRule后向引用。$N引用緊跟在RewriteCond之后的RewriteRule中Pattern的小括號中的規則在當前URL中匹配的內容。N是0 <= N <= 9之間的整數。

(2)%N:RewriteCond后向引用 。%N引用最后一個RewriteCond的Pattern中的小括號中的規則在當前URL中匹配的內容。N是0 <= N <= 9之間的整數。

pattern

(1) !:表示TestString不與當前正則匹配;格式是!CondPattern。
(2) >: 將condPattern作為普通字符串與String比較,String大於Pattern為真;格式是>Pattern。
(3) =:將condPattern作為普通字符串與String比較,String與Pattern相同時為真;格式是=Pattern。
(4) -d:將String當作一個目錄名,檢查它是否存在以及是否是一個目錄;格式是-d。
(5) -f:將String當作一個文件名,檢查它是否存在以及是否是一個文件;格式是-f。
(6) -s:將String當作一個文件名,檢查它是否存在以及是否是一個長度大於0的文件;格式是-s。
(7) -l: 將String當作一個文件名,檢查它是否存在以及是否是一個 symbolic link;格式是-l。
(8) -F:檢查String是否是一個合法的文件,而且通過服務器范圍內的當前設置的訪問控制進行訪問。檢查通過一個內部subrequest完成的, 因此需要謹慎使用,以防止降低服務器的性能。
(9) -U:檢查String是否是一個合法的URL,而且通過服務器范圍內的當前設置的訪問控制進行訪問。檢查通過一個內部subrequest完成的, 因此需要謹慎使用,以防止降低服務器的性能。

[flags]

(1)NC:表示不區分大小寫。
(2)OR:默認的情況下,二個RewriteCond之間是AND的關系,用這個標志將關系改為OR,即滿足任一的RewriteCond即執行RewriteRule。
RewriteEngine On
RewriteCond  [regex1] [OR]
RewrireCond  [regex2] 
RewriteRule  [rule]

RewriteRule

RewriteRule Pattern Substitution [flags]

pattern

作用於當前URL的正則表達式;此url不包含協議、域名和查詢字符串部分。

Substitution

當RewriteCond滿足時,用來替換原始URL指定內容的字符串,還可以包括以下擴展:

(1)$N:RewriteRule后向引用。$N引用緊跟在RewriteCond之后的RewriteRule中Pattern的小括號中的規則在當前URL中匹配的內容。N是0 <= N <= 9之間的整數。

(2)%N:RewriteCond后向引用 。%N引用最后一個RewriteCond的Pattern中的小括號中的規則在當前URL中匹配的內容。N是0 <= N <= 9之間的整數。

[flags]

(1) R:表示重定性,[R=301]表示301重定向,默認是302重定向。
(2) F:強制當前URL為被禁止的,即,立即反饋一個HTTP響應代碼403(被禁止的)。
(3) G:強制當前URL為已廢棄的,即,立即反饋一個HTTP響應代碼410(已廢棄的)。
(4) L:立即停止重寫操作,並不再應用其他重寫規則。 
(5) N:重新執行重寫操作(從第一個規則重新開始). 這時再次進行處理的URL已經不是原始的URL了,而是最后一個重寫規則處理的URL。
(6) C:此標記使當前規則與下一個(其本身又可以與其后繼規則相鏈接的, 並可以如此反復的)規則相鏈接。 它產生這樣一個效果: 如果一個規則被匹配,通常會繼續處理其后繼規則, 即,這個標記不起作用;如果規則不能被匹配,則其后繼的鏈接的規則會被忽略。
(7) NC:忽略大小寫。
(8) QSA:此標記強制重寫引擎在已有的替換串中追加一個請求串,而不是簡單的替換。

示例

1、強制https跳轉

#開啟Rewrite重寫功能
RewriteEngine on

#判斷規則為端口非443結尾
RewriteCond %{SERVER_PORT} !^443$

#強制訪問到https的相應路徑,響應狀態碼是301永久重定向
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

2、404頁面

#開啟Rewrite重寫功能
RewriteEngine on

#請求的文件名為一個常規文件但不存在,默認是AND,所以此處的flags不用設置
RewriteCond %{REQUEST_FILENAME} !-f

#請求的文件名為一個目錄但不存在
RewriteCond %{REQUEST_FILENAME} !-d

#如果既不是常規文件,也不是常規目錄,那么就跳轉到404頁面。
RewriteRule (.*) /404.htm

3、基於User-Agent的訪問控制

#開啟Rewrite重寫功能
RewriteEngine on

#判斷客戶端user-agent信息是否為IE瀏覽器
RewriteCond %{HTTP_USER_AGENT} ^.*MSIE.* [NC]

#滿足是IE瀏覽器,跳轉到404頁面,。表示訪問任何URL
RewriteRule . /404.html [L]

4、QSA

RewriteEngine On
RewriteRule /pages/(.+) /page.php?page=$1

假如現在訪問/pages/88?count=1頁面,只會映射到:/page.php?page=88。

因為默認條件下,不會獲取到查詢字符串部分,(.+)只能匹配到88。

RewriteEngine On
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

訪問/pages/88?count=1頁面,將會映射到:/page.php?page=88&count=1

(1)[QSA]和正則表達式的子表達式配合使用。

(2)88?count=1中的問號被更換為$1

5、偽靜態

RewriteRule ^article-([0-9]+)-([0-9]+)\.html$ portal.php?mod=view&aid=$1&page=$2&%1

輸入article-8342-1.html實質訪問portal.php?mod=view&aid=8342&page=1

6、訪問路徑添加/結尾

#開啟Rewrite重寫功能
RewriteEngine on
#如果當前路徑不是完整的文件路徑,則不生效
RewriteCond ${REQUEST_FILENAME} ! -f
#如果請求路徑是以/結尾,則不生效
RewriteCond ${REQUEST_URI} !(.*)/$
#在路徑后加上/,返回狀態碼301
RewriteRule ^(.*)$ $1/ [L,R=301]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM