天天看點

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} !^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 %{SERVER_PORT} !^443$ 

RewriteRule ^/?(secure_page\.php)$ ​​https://www.example.com/​​$1 [R=301,L]

13.在特定的頁面上強制執行安全服務 遇到同一個伺服器根目錄下分别有一個安全服務域名和一個非安全服務域名,是以你就需要用RewriteCond 判斷安全服務端口是否占用,并且隻将以下清單的頁面要求為安全服務: 

RewriteRule ^/?(page1|page2|page3|page4|page5)$ ​​https://www.example.com/%1​​[R=301,L] 

繼續閱讀