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