1. 程式人生 > >偽靜態與重定向--RewriteRule

偽靜態與重定向--RewriteRule

seo IV body 改變 windows 現在 strong 表示 write

環境: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