13 個mod_rewrite 應用舉例

1.給子域名加www標記 
RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC] 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule .? http://www.%1example.com%{REQUEST_URI} [R=301,L] 
這個規則抓取二級域名的%1變量,若是不是以www開始,那麼就加www,之前的域名以及{REQUEST_URI}會跟在其後。

2.去掉域名中的www標記 
RewriteCond %{HTTP_HOST} !^example\.com$ [NC] 
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]
 

3.去掉www標記,可是保存子域名 
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?example\.com)$ [NC] 
RewriteRule .? http://%1%{REQUEST_URI} [R=301,L]
 
這裏,當匹配到1%變量之後,子域名纔會在%2(內部原子)中抓取到,而咱們須要的正是這個%1變量。 

4.防止圖片盜鏈 
一些站長不擇手段的將你的圖片盜鏈在他們網站上,耗費你的帶寬。你能夠加一下 代碼 阻止這種行爲。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F] 
若是{HTTP_REFERER}值不爲空,或者不是來自你本身的域名,這個規則用[F]FLAG阻止以gif|jpg|png 結尾的URL 
若是對這種盜鏈你是堅定鄙視的,你還能夠改變圖片,讓訪問盜鏈網站的用戶知道該網站正在盜用你的圖片。 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?example\.com/.*$ [NC] 
RewriteRule \.(gif|jpg|png)$ 你的圖片地址 [R=301,L] 
除了阻止圖片盜鏈 連接 ,以上規則將其盜鏈的圖片所有替換成了你 設置 的圖片。 
你還能夠阻止特定域名盜鏈你的圖片: 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?leech_site\.com/ [NC] 
RewriteRule \.(gif|jpg|png)$ - [F,L]
 
這個規則將阻止域名黑名單上全部的圖片連接請求。 
固然以上這些規則都是以{HTTP_REFERER}獲取域名爲基礎的,若是你想改用成IP地址,用{REMOTE_ADDR}就能夠了。

5.若是文件不存在重定向到404頁面 
若是你的主機沒有提供404頁面重定向服務,那麼咱們本身建立。 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .? /404.php [L] 
這裏-f匹配的是存在的文件名,-d匹配的存在的路徑名。這段代碼在進行404重定向以前,會判斷你的文件名以及路徑名是否存在。你還能夠在404頁面上加一個?url=$1參數: 
RewriteRule ^/?(.*)$ /404.php?url=$1 [L]  
這樣,你的404頁面就能夠作一些其餘的事情,例如默認信心,發一個郵件提醒,加一個 搜索 ,等等。

6.重命名目錄  
若是你想在網站上重命名目錄,試試這個: 
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]  
在規則裏我添加了一個「.」(注意不是表明得全部字符,前面有轉義符)來匹配文件的後綴名。 

7.將.html後綴名轉換成.php  
前提是.html文件能繼續訪問的狀況下,更新你的網站連接。 
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]  
這不是一個網頁重定向,因此訪問者是不可見的。讓他做爲一個永久重定向(可見的),將FLAG修改[R=301,L]。 

8.建立無文件後綴名連接  
若是你想使你的 PHP 網站的連接更加簡潔易記-或者隱藏文件的後綴名,試試這個: 
RewriteRule ^/?([a-z]+)$ $1.php [L]  
若是網站混有PHP以及HTML文件,你能夠用RewriteCond先判斷該後綴的文件是否存在,而後進行替換: 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.php [L] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^/?([a-zA-Z0-9]+)$ $1.html [L]
 
若是文件是以.php爲後綴,這條規則將被執行。

9.檢查查詢變量裏的特定參數  
若是在URL裏面有一個特殊的參數,你可用RewriteCond鑑別其是否存在: 
RewriteCond %{QUERY_STRING} !uniquekey= 
RewriteRule ^/?script_that_requires_uniquekey\.php$ other_script.php [QSA,L]
 
以上規則將檢查{QUERY_STRING}裏面的uniquekey參數是否存在,若是{REQUEST_URI}值爲script_that_requires_uniquekey,將會定向到新的URL。 

10.刪除查詢變量  
Apache的mod_rewrite模塊會自動辨識查詢變量,除非你作了如下改動: 
a).分配一個新的查詢參數(你能夠用[QSA,L]FLAG保存最初的查詢變量) 
b).在文件名後面加一個「?」(好比index.php?)。符號「?」不會在瀏覽器的地址欄裏顯示。

11.用新的格式展現當前URI 
若是這就是咱們當前正在運行的URLs:/index.php?id=nnnn。咱們很是但願將其更改爲/nnnn而且讓搜索引擎以新格式展示。首先,咱們爲了讓搜索引擎更新成新的,得將舊的URLs重定向到新的格式,可是,咱們還得保證之前的index.php照樣可以運行。是否是被我搞迷糊了? 
實現以上 功能 ,訣竅就在於在查詢變量中加了一個訪問者看不到的標記符「marker」。咱們只將查詢變量中沒有出現「marker」標記的連接進行重定向,而後將原有的連接替換成新的格式,而且經過[QSA]FLAG在已有的參數加一個「marker」標記。如下爲實現的方式: 
RewriteCond %{QUERY_STRING} !marker 
RewriteCond %{QUERY_STRING} id=([-a-zA-Z0-9_+]+) 
RewriteRule ^/?index\.php$ %1? [R=301,L] 
RewriteRule ^/?([-a-zA-Z0-9_+]+)$ index.php?marker &id=$1 [L]

這裏,原先的URL: http://www.example.com/index.php?id=nnnn ,不包含marker,因此被第一個規則永久重定向到 http://www.example.com/nnnn ,第二個規則將 http://www.example.com/nnnn 反定向到 http://www.example.com/index.php?marker &id=nnnn,而且加了marker以及id=nnnn兩個變量,最後mod_rewrite就開始進行處理過程。
第二次匹配,marker被匹配,因此忽略第一條規則,這裏有一個「.」字符會出如今 http://www.example.com/index.php?marker  &id=nnnn中,因此第二條規則也會被忽略,這樣咱們就完成了。
注意,這個 解決 方案要求Apache的一些擴展功能,因此若是你的網站放於在共享主機中會遇到不少障礙。

12.保證安全服務啓用  
Apache能夠用兩種方法辨別你是否開啓了安全服務,分別引用{HTTPS}和{SERVER_PORT}變量: 
RewriteCond %{REQUEST_URI} ^secure_page\.php$ 
RewriteCond %{HTTPS} !on 
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1 [R=301,L]
 
以上規則測試{REQUEST_URI}值是否等於咱們的安全頁代碼,而且{HTTPS}不等於on。若是這兩個條件同時知足,請求將被重定向到安全服務URI.另外你可用{SERVER_PORT}作一樣的測試,443是經常使用的安全服務端口 
RewriteCond %{REQUEST_URI} ^secure_page\.php$ 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(secure_page\.php)$ https://www.example.com/$1 [R=301,L]

13.在特定的頁面上強制執行安全服務 
遇到同一個服務器根目錄下分別有一個安全服務域名和一個非安全服務域名,因此你就須要用RewriteCond 判斷安全服務端口是否佔用,而且只將如下列表的頁面要求爲安全服務: 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteRule ^/?(page1|page2|page3|page4|page5)$ https://www.example.com/%1[R=301,L] 
如下是怎樣將沒有設置成安全服務的頁面返回到80端口: 
RewriteCond %{ SERVER_PORT } ^443$ 
RewriteRule !^/?(page6|page7|page8|page9)$http://www.example.com%{REQUEST_URI} [R=301,L]
相關文章
相關標籤/搜索