僞靜態與重定向--RewriteRule

僞靜態與重定向--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

 

如需轉載,請註明文章出處,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章