僞靜態與重定向--RewriteRule

環境:windows 10,phpstudy,sublime text。服務器使用Apache,網站根目錄爲E:\phpstudy\www\,因此.htaccess放在www目錄下。php

RewriteRule語法說明:html

RewriteRule  模式匹配  替換的URL  [flags]正則表達式

模式匹配使用perl語言的正則表達式語法,同時還可使用一些rewrite預約義的變量windows

替換的URL支持模式匹配的結果和rewrite變量xcode

多個flag用逗號隔開服務器

例子1網站

此時根目錄只有index.htm,將全部訪問 *.htm的請求都重定向到  *.html搜索引擎

RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html
# $1在正則表達式中表示前面第一個匹配的子表達式,即.*部分 

  注意配置中的RewriteEngine On表示開啓重寫,注意請求的URL是 index.htm ,重定向到index.html,可是地址欄仍然爲index.htmurl

 若是在根目錄建立一個index.html文件,再刷新的話,結果就不一樣了:spa

 

RewriteRule R flag說明

R表示強制外部重定向,後面能夠加301(永久重定向)或者302(暫時重定向)跳轉,不加默認302(暫時重定向),加了R flag以後,地址欄的URL會改變

這兩種重定向的區別在於:SEO搜索引擎對網站是有評分的,若是使用臨時重定向,則不會將搜索引擎對之前URL的評分 給 臨時重定向(新的)的網站URL,會爲新的URL產生一個新的評分;而永久重定向則會將評分轉給新的URL。

使用示例:

  此時根目錄爲空,仍舊訪問localhost/index.htm

RewriteEngine On
RewriteRule ^(.*)\.htm$ $1.html [R]
#等價於下面這一條
#RewriteRule ^(.*)\.htm$ $1.html [R=302]

注意上面的圖片中,外部重定向時,地址欄的URL發生了改變,而且是按照磁盤的路徑去查找,而不是按照網站根目錄去查找,這時能夠在$1前面加一個斜線 / ,表示重定向的基地址爲網站根目錄,以下例:

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文件,

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,因此不會匹配下面一條

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/$1.html [L]
RewriteRule ^(.*)\.html$	/$1.php

  

若是直接訪問index.html,由於第一條規則沒有匹配,那麼會接着匹配第二條規則。

 

RewriteRule NE flag 說明

不對URL中的字符進行hexcode轉碼,好比咱們傳遞一個參數,那麼

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/index.html#$1  [R]

訪問localhost/index.htm

能夠看到#被轉移成了十六進制的%23,加上NE參數

RewriteEngine On
RewriteRule ^(.*)\.htm$  	/index.html#$1  [R,NE]

  

 

 RewriteRule NC flag說明

NC是指在匹配時,不區分大小寫。由於在Apache自己對大小寫是敏感的,

實例:

RewriteEngine On
RewriteRule ^index.htm index.html 

能夠看到,並無匹配第一條規則,由於此時是區分大小寫的。加上NC以後,刷新:

RewriteEngine On
RewriteRule ^index.htm index.html [NC]

 

 RewriteRule G flag說明

表示請求的網頁已經失效(對應響應碼的410),而且中止後續規則的匹配

RewriteEngine On
RewriteRule .* - [G]
#RewriteRule .* index.html

 

 RewriteRule QSA flag說明

用於在URL中截取查詢字段,也就是保留用URL傳遞的參數,由於默認是會將參數截取掉的

RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R]

  訪問localhost/per/index.htm?id=5

若是沒有QSA字段,傳遞的id=5被截取掉了。若是加上QSA字段:

RewriteEngine On
RewriteRule ^per/(.*)$ /per.php?url=$1 [R,QSA]

  再次訪問localhost/per/index.htm?id=5

相關文章
相關標籤/搜索