|
|
|
發新文章 |
|
|
利用mod_rewrite將動態網頁轉換為靜態的網頁 (2006年12月13日--9:31:15)
以數據庫后臺驅動的動態內容的網站,經常會遇到這些的問題:
-
當在瀏覽器的地址欄輸入一個無效的參數時,會出現數據庫的錯誤提示,這是一個安全的隱患
-
搜索引擎無法收錄你的所有網頁
-
網頁的鏈接地址是一系列的參數,對瀏覽用戶和搜索引擎都不易理解
/ul> 這些問題都可以通過Apache服務器的一個基本的模塊mod_rewrite來解決,默認的安裝的Apache就會裝有這個模塊。要啟用這個模塊,打開httpd.conf文件,察看下面的兩行是否被屏蔽,第一行是載入mod_rewrite模塊,第二行是啟用這個模塊。
LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c
mod_rewrite這個模塊是如何工作的呢?
mod_rewrite截獲符合特定條件的URL,并按照設定的規則將它們改寫成需要的URL。
比如,可以將 http://www.mysite.com/product.php?pid=123312 這樣的URL改寫成 http://www.mysite.com/product-123312.html 這樣的靜態URL,或者是更具體的 http://www.mysite.com/product/thinkpad-t42.html
重寫的規則
重寫的規則的表達式:
RewriteRule 模式 替換 [選項]
RewriteRule 是一個簡單的命令告訴mod_rewrite這個模塊如何去重寫,關鍵的地方在于可以在模式和替換中使用正則表達式來匹配相應的字符,正則表達式的廣泛的靈活性能將動態的URL轉換成各式各樣的符合要求的靜態URL。看看這個重寫規則:
RewriteRule /products/([0-9]+) /fancy/products.php?id=$1
當你在瀏覽器地址欄輸入 http://www.mysite.com/product/123 時,這個地址被重寫為 http://www.mysite.com/fancy/product.php?id=123
這樣,訪問者就無法知道你的程序真正放在那個目錄,程序的真正名字是什么,這也提高了網站的安全系數;這樣的URL也去掉了?=這些字符,易于搜索引擎的機器人爬行你的網站。
通過正則表達式,可以寫出更復雜的重寫規則:
RewriteRule ^/products$ /content.php RewriteRule ^/products/([0-9]+)$ /content.php?id=$1 RewriteRule ^/products/([0-9]+),([ad]*),([0-9]{0,3}),([0-9]*),([0-9]*$)
重寫規則的選項有
-
‘forbidden’ 或 ‘f’ - 403 禁止
-
‘gone’ 或 ‘g’ - 410 gone
-
‘nocase’ 或 ‘NC’ - 大小寫敏感
-
‘next’/N’ - 回到第一條規則
-
’skip=N’ 或 ‘S=N’ - 跳過下面的N條規則
流程控制
mod_rewrite是按照從上到下的順序執行重寫的規則,如果URL匹配了第一條規則,則按照第一條規則進行重寫,如果不匹配,就執行第二條規則,直到最后。通過流程控制,可以定義在不同情況下采用不同的重寫規則。格式是:
RewriteCond 測試條件 Condition
這些測試條件有:
-
HTTP變量: HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_FORWARDED, HTTP_HOST, HTTP_PROXY_CONNECTION, HTTP_ACCEPT
-
連結和請求的變量: REMOTE_ADDR, REMOTE_HOST, REMOTE_USER, REMOTE_IDENT, REQUEST_METHOD, SCRIPT_FILENAME, PATH_INFO, QUERY_STRING, AUTH_TYPE
-
服務器內部變量: DOCUMENT_ROOT, SERVER_ADMIN, SERVER_NAME, SERVER_ADDR, SERVER_PORT, SERVER_PROTOCOL, SERVER_SOFTWARE
-
系統變量: TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME
-
mod_rewrite特殊值: API_VERSION, THE_REQUEST, REQUEST_URI,
例如,利用mod_rewrite可以禁止從其他的網站鏈接到你的圖片:
RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [OR,NC] RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [OR,NC] RewriteCond %{HTTP_REFERER} !^http://www.mysite.com/.*$ [OR,NC] RewriteRule .*\.(gif|GIF|jpg|JPG)$ http://mysite/images/bad.gif [L,R]
|