偽靜態與重定向--RewriteRule
環境:windows 10,phpstudy,sublime text。服務器使用Apache,網站根目錄為E:\phpstudy\www\,所以.htaccess放在www目錄下。
RewriteRule語法說明:
RewriteRule 模式匹配 替換的URL [flags]
模式匹配使用perl語言的正則表達式語法,同時還可以使用一些rewrite預定義的變量
替換的URL支持模式匹配的結果和rewrite變量
多個flag用逗號隔開
例子1
此時根目錄只有index.htm,將所有訪問 *.htm的請求都重定向到 *.html
1 2 3 |
RewriteEngine On RewriteRule ^(.*)\.htm$ $1.html
# $1在正則表達式中表示前面第一個匹配的子表達式,即.*部分
|
註意配置中的RewriteEngine On表示開啟重寫,註意請求的URL是 index.htm ,重定向到index.html,但是地址欄仍然為index.htm
如果在根目錄創建一個index.html文件,再刷新的話,結果就不同了:
RewriteRule R flag說明
R表示強制外部重定向,後面可以加301(永久重定向)或者302(暫時重定向)跳轉,不加默認302(暫時重定向),加了R flag之後,地址欄的URL會改變
這兩種重定向的區別在於:SEO搜索引擎對網站是有評分的,如果使用臨時重定向,則不會將搜索引擎對以前URL的評分 給 臨時重定向(新的)的網站URL,會為新的URL產生一個新的評分;而永久重定向則會將評分轉給新的URL。
使用示例:
此時根目錄為空,仍舊訪問localhost/index.htm
1 2 3 4 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html [R]
#等價於下面這一條
#RewriteRule ^(.*)\.htm$ $1.html [R=302]
|
註意上面的圖片中,外部重定向時,地址欄的URL發生了改變,並且是按照磁盤的路徑去查找,而不是按照網站根目錄去查找,這時可以在$1前面加一個斜線 / ,表示重定向的基地址為網站根目錄,如下例:
1 2 3 4 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ /$1.html [R] #等價於下面這一條
#RewriteRule ^(.*)\.htm$ /$1.html [R=302]
|
創建index.html文件,再訪問localhost/index.htm
RewriteRule C flag說明
C表示鏈接下一規則,如果在一條規則後面加了該flag後,這條規則就和下一條規則成為一個整體,如果這一條規則不匹配,那麽下一條也不進行匹配,類似於“拉著別人下水的”的情景。
註意這裏的匹配的時候,前一條的匹配之後,URL改變了,然後,將新的URL進行下一條規則的匹配。
實例:
網站根目錄下只有index.html和index.php文件,
1 2 3 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ /$1.html [C]
RewriteRule ^(.*)\.html$ /$1.php
|
現在結果如下圖:
而如果直接訪問index.html,那麽因為不匹配第一條規則,所以不進行第二條規則匹配,不會重定向到index.php,會直接輸出index.html的內容。
RewriteRule L flag說明
如果一條規則的後面添加了這個L flag,那麽如果這條規則匹配,就不在進行下一條規則的匹配,如果改規則不匹配,則會繼續進行下一規則的匹配。
實例:
根目錄下有index.html,index.php,訪問index.htm,因為匹配到了第一條規則,並且後面有L flag,所以不會匹配下面一條
1 2 3 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ /$1.html [L]
RewriteRule ^(.*)\.html$ /$1.php
|
如果直接訪問index.html,因為第一條規則沒有匹配,那麽會接著匹配第二條規則。
RewriteRule NE flag 說明
不對URL中的字符進行hexcode轉碼,比如我們傳遞一個參數,那麽
1 2 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ /index.html#$1 [R]
|
訪問localhost/index.htm
可以看到#被轉移成了十六進制的%23,加上NE參數
1 2 |
RewriteEngine On
RewriteRule ^(.*)\.htm$ /index.html#$1 [R,NE]
|
RewriteRule NC flag說明
NC是指在匹配時,不區分大小寫。因為在Apache本身對大小寫是敏感的,
實例:
1 2 |
RewriteEngine On
RewriteRule ^index.htm index.html
|
可以看到,並沒有匹配第一條規則,因為此時是區分大小寫的。加上NC之後,刷新:
1 2 |
RewriteEngine On
RewriteRule ^index.htm index.html [NC]
|
RewriteRule G flag說明
表示請求的網頁已經失效(對應響應碼的410),並且停止後續規則的匹配
1 2 3 |
RewriteEngine On
RewriteRule .* - [G]
#RewriteRule .* index.html
|
RewriteRule QSA flag說明
用於在URL中截取查詢字段,也就是保留用URL傳遞的參數,因為默認是會將參數截取掉的
1 2 |
RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R]
|
訪問localhost/per/index.htm?id=5
如果沒有QSA字段,傳遞的id=5被截取掉了。如果加上QSA字段:
1 2 |
RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R,QSA]
|
再次訪問localhost/per/index.htm?id=5
偽靜態與重定向--RewriteRule