原文鏈接:http://www.benben.cc/blog/?p=305
Apache中有著這樣一個模塊,它默默無聞,卻是URL操作的瑞士軍刀!有人這樣評價它:“盡管它的例子和文檔數量可以以噸來計算,但它仍然是巫術,該死的巫術。”
它是一個基于一定規則的實時重寫URL請求的引擎,它的名字叫做“rewrite_module”,它的源文件是“mod_rewrite.c”。
1、什么是mod_rewrite?
mod_rewrite是一個Apache模塊,該模塊提供了一個基于規則的(使用正則表達式分析器的)實時重寫URL請求的引擎,從而使得服務器可以操縱客戶端所請求的網址。mod_rewrite會通過事先已經定義的正則表達式規則對請求的網址進行匹配檢查,如果在地址中匹配到一個規則,并滿足相應的條件,該規則就會被一個替代的字符串或者是動作所取代。
2、使用mod_rewrite的優點?
使用mod_rewrite,有兩個最為顯著的優點,一是能夠將丑陋的、復雜的網址轉化為所謂的“友好的”或者是“干凈的”網絡地址。如此一來,不僅僅提升了良好的用戶體驗,而且還有利于搜索引擎對網址的抓取分析,創建友好的網址也是一種搜索引擎優化(SEO)技術。
來看看下邊的例子:
通過我們的改造,新網址更容易為人類所理解,瞥一眼就可以很容易記憶,諸如此類的網址不僅僅是看上去變的簡單了,對搜索引擎來說也是友好的,可以使搜索引擎更好的從中提取語義,除了這些簡單的轉換,mod_rewrite還可以靈活的做很多的事情。當然,所有這些功能和靈活性帶來一個問題,那就是復雜性,因此,不要指望一天之內就能看懂整個模塊。
二是能夠顯著的提升網站的安全性,網址1的方式是一種暴露式的腳本調用,倘若程序編寫時候過濾不周密就會導致調用失敗,甚至導致數據庫的破壞。然而通過轉換為更加友好的網址形式,用戶并不知道list.php的存在,試圖在這種情況下進行攻擊在執行PHP之前就已經失敗了。
3、如何啟用mod_rewrite?
在服務器上啟用mod_rewrite模塊必須修改全局配置文件(httpd.conf),如果你想確認你的主機是否支持該模塊,只需要打開httpd.conf文件,找到
LoadModule rewrite_module modules/mod_rewrite.so
如果不幸它被注釋掉了(行首#為注釋符號),那么刪掉注釋符號”#”重啟服務器即可。除此之外,你還可以通過phpinfo()來測試mod_rewrite模塊是否啟用:
<?php phpinfo(); ?>
在”Loaded Modules”中,如果你能看到”mod_rewrite”的身影,那么恭喜你,你的服務器支持mod_rewrite模塊。4、哪個文件用來存儲mod_rewrite規則?
如果你的主機是Windows,那么你需要將規則寫進httpd.ini,如果你的主機是Linux,就需要用.htaccess來大展身手了。
5、mod_rewrite的典型應用有哪些?
在許多學科,除非你自己親自動手嘗試,否則你是不可能學會的!學習偽靜態尤其是如此,mod_rewrite有許多非常貼近實際應用的用途,譬如如下三種典型的應用:
a.子目錄綁定
譬如a.com指向我們服務器的根目錄\public_html\,而特殊需要使得我們需要將b.com指向到服務器的子目錄\public_html\b,但是有時候我們的服務器并不支持子目錄綁定,這時候我們可以將b.com像a.com一樣綁定至根目錄,然后通過htaccess進行URL重定向從而間接的實現子目錄的綁定。
AddHandler application/x-httpd-php5s .php
RewriteEngine onRewriteCond %{HTTP_HOST} ^(www.)?b.com$
RewriteCond %{REQUEST_URI} !^/b/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /b/$1RewriteCond %{HTTP_HOST} ^(www.)?b.com$
RewriteRule ^(/)?$ b/default.html [L]
通過這些規則,就能夠使得我們訪問b.com的時候,自動重定向到http://a.com/b/,從而達到了我們間接實現子目錄綁定的目的。b.網址歸一化
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
這是一條最經典的重寫規則,它能夠將用戶輸入的所有開頭為http://www.example.com/的網址硬性重定向到http://example.com/,比如用戶輸入http://www.example.com/admin,重寫后網址就變成了http://example.com/admin。c.圖片防盜鏈
網站盜鏈會大量消耗被盜鏈網站的帶寬,而真正的點擊率也許會很小,嚴重損害了被盜鏈網站的利益。早期的盜鏈一般是一些比較小的網站盜取一些有實力的大網站的地址,盜鏈的目標比較有針對性,現如今,一些大型的網站也已經開始把盜鏈的目光鎖定在了整個互聯網上,竊取整個互聯網上的其它機器的帶寬。常見的盜鏈有以下幾種:圖片盜鏈、音頻盜鏈、視頻盜鏈、文件盜鏈。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !example.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]RewriteRule .*\.(gif|jpg|png)$ http://www.example.com/nolinks.gif [R,NC,L]
</IfModule>
規則中的網址我暫且稱作“白名單”,亦即只有白名單中的網址可以訪問服務器上的資源。而規則最后則限定了防盜鏈所起作用的文件類型(gif|jpg|png),如果有其它網站試圖訪問服務器上被限定的文件類型,就會被重定向到我們指定的警告圖片。
當然,這種方法并不是100%有效的,但是不可否認,它是禁止大多數盜鏈的最有效的方法。