1. 程式人生 > 實用技巧 >apache 配置.htaccess實現偽靜態 url重寫

apache 配置.htaccess實現偽靜態 url重寫

文章轉載自:https://www.cnblogs.com/-beyond/p/8325144.html

使用apache偽靜態需要修改apache配置檔案,開啟Rewrite重寫模組

#開啟重寫引擎
RewriteEngine On

1.RewriteRule 根據匹配規則,重寫url

RewriteRule語法說明:

RewriteRule 模式匹配 替換的URL [flags]

內部重定向

#開啟重寫引擎
RewriteEngine On
#內部重定向
#RewriteRule ^(.*)\.htm$ $1.

使用內部重定向瀏覽器地址不會發生變化

外部重定向

#開啟重寫引擎
RewriteEngine On
#R引數-外部重定向 301永久重定向,對搜尋引擎友好,302臨時重定向
RewriteRule ^(.*)\.hta$ $1.html [R=301]

外部重定向利用http協議告訴瀏覽器進行跳轉,這裡有個問題就是路徑載入錯誤

RewriteRule ^(.*)\.hta$ /$1.html [R=301]
這裡需要在重寫後的地址前面加“/”,另外一種方式是設定RewriteBase url重寫基準目錄

RewriteRule C flag

C表示連結下一規則,如果在一條規則後面加了該flag後,這條規則就和下一條規則成為一個整體,如果這一條規則不匹配,那麼下一條也不進行匹配,類似於“拉著別人下水的”的情景。

注意這裡的匹配的時候,前一條的匹配之後,URL改變了,然後,將新的URL進行下一條規則的匹配,類似邏輯判斷與運算。

#開啟重寫引擎
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)\.htm$ $1.htas [C]
RewriteRule ^(.*)\.hta$ $1.ht [C]
RewriteRule ^(.*)\.ht$ $1.php [R=301]

RewriteRule L flag說明

如果一條規則的後面添加了這個L flag,那麼如果這條規則匹配,就不在進行下一條規則的匹配,如果改規則不匹配,則會繼續進行下一規則的匹配。

例項:

  根目錄下有index.html,index.php,訪問index.htm,因為匹配到了第一條規則,並且後面有L flag,所以不會匹配下面一條,類似程式設計邏輯或運算。

RewriteRule NE flag 說明

不對URL中的字元進行hexcode轉碼

RewriteRule ^(.*)\.htm$ $1.hta#index [R]

外部重定向,#會被轉義

 新增NE標籤,瀏覽器地址顯示正常

#NE標籤
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE]

RewriteRule NC flag說明

NC是指在匹配時,不區分大小寫。因為在Apache本身對大小寫是敏感的,

#NC標籤
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE,NC]

RewriteRule G flag說明

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

#G標籤
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE,NC,G]

RewriteRule QSA flag說明

用於在URL中擷取查詢欄位,也就是保留用URL傳遞的引數,因為預設是會將引數擷取掉的

規則不加QSA標籤 http://r.com/aa.htm?a=b&b=c 
#QSA標籤
RewriteRule ^(.*)\.htm$ $1.hta#index [R,NE,NC,QSA]

Rewritecond-變數的使用
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php
#上面語句的作用是如果你訪問的上一個頁面的主機地址是www.test.cn,則無論你當前訪問的是哪個頁面,都會跳轉到對test.php的訪問。

RewriteCond %{REMOTE_HOST} ^test1.* [OR]
RewriteCond %{REMOTE_HOST} ^test2.* [OR]
RewriteCond %{REMOTE_HOST} ^test3.*
RewriteRule (.*)$ test.php
#上面語句的作用是如果你的地址是test1或test2或test3的時候,則就跳到對test.php。從這裡可以看出,RewriteCond語句之間預設的是AND,如果想要OR,則要明確的寫出來。


rewritecond-其他常用的判斷條件
RewriteCond %{REQUEST_FILENAME} !-f //如果檔案存在,就直接訪問檔案,不進行下面的RewriteRule.(不是檔案或檔案不存在就執行重寫)

RewriteCond %{REQUEST_FILENAME} !-d //#如果目錄存在就直接訪問目錄不進行RewriteRule

RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg)$ //#如果是這些字尾的檔案,就直接訪問檔案,不進行Rewrite