作為站長,你要決定怎樣提高你網頁對訪問者的辨識度以及在重寫的uri地址里放入適當的信息。在創建新的uri規則的時候務必考慮詳細周全一些。另外當你完成新的uri規則以后,必須回去更新以前老的鏈接來匹配新的規則。
當你在設計新的uri規則的時候,一定注意其唯一性。舉一個先前的例子,我用了國家名,州省名,城市名作為uri的元素,因為他們在數據庫教程里面都是唯一的。但是如果建立一個讓用戶自己更新的數據庫,我們沒有理由讓用戶取的文章名字保持唯一性,所以文章一般在數據庫里是以一個自動增長的id作為唯一識別碼,這個唯一id對url重寫規則相當友好,它可以使你的重寫規則更加簡潔,在url里面可以用原子非常直接的將其值標識出來。
人們通常想映射數據庫里面的值比如標題以及其他字符作為url的標識,在mod_rewrite中有一個rewritemap狀態專門處理這種情況,但是前提是你必須有修改apache配置文件httpd.conf的權限。所以為了根本避免這個問題,還是直接用id創建你的鏈接吧。
空格是以%20的形式展示在url中的,所以你必須在php教程代碼里面將其替換掉,php的str_replace函數完全可以勝任這項工作。你只需要在$_get獲取查詢值的時候,將其替換就可以了。但是在數據庫中空格是難免的,所以我寧愿將空格替換成下劃線,以下為php代碼:
$name = str_replace ( ‘ ‘, ‘_’, $name );
在添加新的url規則的時候,小心不要打破了原先已存在的鏈接間的相對關系。開發人員通常會驚訝為什么有時候css教程,網頁特效,圖片等文件出現錯誤或者不啟作用了。記住相對鏈接只匹配你當前url的地址,所以你需要將這些相對鏈接更改成絕對鏈接地址,或者在你的靜態網頁加上html
13 個mod_rewrite 應用舉例
先前我們舉了一個給每個鏈接加一個www的列子,現在讓我們看看用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)$ http://www.example.com/hotlinked.gif [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]
在規則里我添加了一個“.”(注意不是代表得所有字符,前面有轉義符)來匹配文件的后綴名。
新聞熱點
疑難解答