1.去掉域名中的www標記
復制代碼代碼如下:
RewriteCond %{HTTP_HOST} !^jb51\.net$ [NC]
RewriteRule .? //yiehua.com%{REQUEST_URI} [R=301,L]
2.去掉www標記,但是保存子域名
復制代碼代碼如下:
RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?jb51\.net)$ [NC]
RewriteRule .? //%1%{REQUEST_URI} [R=301,L]
這里,當匹配(pei)到1%變量(liang)以(yi)后,子域名(ming)才(cai)會在%2(內部原子)中抓(zhua)取到,而(er)我們需要的(de)正(zheng)是這個%1變量(liang)。
3.給子域名加www標記
復制代碼代碼如下:
RewriteCond %{HTTP_HOST} ^([a-z.]+)?jb51\.net$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? //www.%1yiehua.com%{REQUEST_URI} [R=301,L]
這個規則(ze)抓(zhua)取二(er)級域名(ming)的%1變量,如(ru)果不是以www開始,那么就(jiu)加www,以前的域名(ming)以及{REQUEST_URI}會(hui)跟在其后。
4.防止圖片盜鏈
一些站長不擇手段的將(jiang)你的圖片(pian)盜鏈(lian)在他們網(wang)站上,耗(hao)費你的帶(dai)寬。你可以加一下代碼阻止這種行為。
復制代碼代碼如下:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^//(www\.)?jb51\.net/ [NC]
RewriteRule \.(gif|jpg|png)$ – [F]
如(ru)果(guo){HTTP_REFERER}值不為空,或者不是來自(zi)你自(zi)己的(de)(de)域名,這個規(gui)則(ze)用[F]FLAG阻止以gif|jpg|png 結尾的(de)(de)URL
如果對這種盜鏈你是(shi)堅決鄙視的(de)(de),你還可(ke)以改變圖片,讓訪(fang)問盜鏈網(wang)站(zhan)的(de)(de)用戶知道該網(wang)站(zhan)正在盜用你的(de)(de)圖片。
復制代碼代碼如下:
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^//(www\.)?jb51\.net/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ 你的圖片地址 [R=301,L]
除了阻(zu)止圖(tu)片盜鏈鏈接(jie),以上規(gui)則將其盜鏈的(de)圖(tu)片全部替換成(cheng)了你(ni)設置的(de)圖(tu)片。
你還可以(yi)阻止特定域名盜鏈你的圖片:
復制代碼代碼如下:
RewriteCond %{HTTP_REFERER} !^//(www\.)?leech_site\.net/ [NC]
RewriteRule \.(gif|jpg|png)$ – [F,L]
這個規則將阻止(zhi)域名(ming)黑名(ming)單上所(suo)有的圖(tu)片鏈(lian)接請求。
當然以(yi)上(shang)這(zhe)些規(gui)則都是以(yi){HTTP_REFERER}獲(huo)取域(yu)名為基(ji)礎的(de),如果(guo)你想改(gai)用成IP地址,用{REMOTE_ADDR}就可以(yi)了(le)。
5.如果文件不存在重定向到404頁面
如果你的主機沒有提供404頁面重定向服務,那么我們自己創建。
復制代碼代碼如下:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? /404.php [L]
這里-f匹(pi)配(pei)的(de)是(shi)(shi)存(cun)(cun)在(zai)的(de)文(wen)件(jian)名(ming),-d匹(pi)配(pei)的(de)存(cun)(cun)在(zai)的(de)路徑名(ming)。這段代碼(ma)在(zai)進行404重定向之前,會(hui)判(pan)斷你(ni)的(de)文(wen)件(jian)名(ming)以(yi)及路徑名(ming)是(shi)(shi)否存(cun)(cun)在(zai)。你(ni)還可(ke)以(yi)在(zai)404頁面上加(jia)一個?url=$1參數:
復制代碼代碼如下:
RewriteRule ^/?(.*)$ /404.php?url=$1 [L]
這(zhe)樣(yang),你(ni)的404頁面就可以(yi)做(zuo)一(yi)些***的事情(qing),例如默(mo)認(ren)信心,發一(yi)個郵件提醒,加一(yi)個搜索,等等。
6.重命名目錄
如果(guo)你想在網站上(shang)重命(ming)名目錄,試試這個:
復制代碼代碼如下:
RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
在規則里我(wo)添加了一個“.”(注意不是(shi)代表得所有(you)字(zi)符,前面有(you)轉義符)來匹配文件的后綴名。
7.將.html后綴名轉換成.php
前提是.html文件能繼續訪問的(de)情況下,更新(xin)你的(de)網(wang)站鏈接(jie)。
復制代碼代碼如下:
RewriteRule ^/?([a-z/]+)\.html$ $1.php [L]
這不是(shi)一個網頁重定(ding)(ding)向(xiang),所以訪問者是(shi)不可見(jian)的(de)。讓他作為一個永久(jiu)重定(ding)(ding)向(xiang)(可見(jian)的(de)),將(jiang)FLAG修改(gai)[R=301,L]。
8.創建無文件后綴名鏈接
如果你想使你的PHP網站的鏈接更加簡潔易記-或者隱藏文件的后綴名(ming),試試這個:
復制代碼代碼如下:
RewriteRule ^/?([a-z]+)$ $1.php [L]
如果網站混有PHP以(yi)及HTML文件,你可以(yi)用(yong)RewriteCond先(xian)判斷該后綴(zhui)的文件是(shi)否存在(zai),然后進(jin)行替換(huan):
復制代碼代碼如下:
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]
如果(guo)文件是以.php為后綴(zhui),這條規(gui)則將被執行。
9.檢查查詢變量里的特定參數
如(ru)果在URL里面(mian)有(you)一個特殊的參數,你可用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模塊會(hui)自動(dong)辨(bian)識查(cha)詢變量,除非你做了以下改(gai)動(dong):
a).分配(pei)一個新的查(cha)詢參數(你可以用[QSA,L]FLAG保存最(zui)初(chu)的查(cha)詢變量)
b).在文件(jian)名后面加一個“?”(比(bi)如(ru)index.php?)。符號“?”不會(hui)在瀏覽器(qi)的地址欄里顯示。
11.用新的格式展示當前URI
如(ru)果這(zhe)就(jiu)是(shi)(shi)我(wo)們(men)(men)(men)當(dang)前正在(zai)運行的(de)URLs:/index.php?id=nnnn。我(wo)們(men)(men)(men)非常(chang)希望將其更改成/nnnn并且(qie)讓搜(sou)索引擎以新格(ge)式展現。首先(xian),我(wo)們(men)(men)(men)為了讓搜(sou)索引擎更新成新的(de),得將舊的(de)URLs重(zhong)定(ding)向到新的(de)格(ge)式,但(dan)是(shi)(shi),我(wo)們(men)(men)(men)還得保證以前的(de)index.php照樣能夠運行。是(shi)(shi)不是(shi)(shi)被(bei)我(wo)搞迷糊(hu)了?
實現以(yi)(yi)上(shang)功能,訣竅(qiao)就(jiu)在于在查詢變量中(zhong)加了一個訪(fang)問者看不到的(de)標(biao)記(ji)符“marker”。我(wo)們只(zhi)將查詢變量中(zhong)沒有(you)出(chu)現“marker”標(biao)記(ji)的(de)鏈接(jie)進行重定向,然(ran)后(hou)將原有(you)的(de)鏈接(jie)替換成(cheng)新的(de)格式,并且通過[QSA]FLAG在已有(you)的(de)參數(shu)加一個“marker”標(biao)記(ji)。以(yi)(yi)下為(wei)實現的(de)方式:
復制代碼代碼如下:
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://www.yiehua.com/index.php?id=nnnn,不包含marker,所以(yi)被第(di)一個(ge)(ge)規(gui)則永久(jiu)重定(ding)向到//www.yiehua.com/nnnn,第(di)二個(ge)(ge)規(gui)則將(jiang)//www.yiehua.com/nnnn反定(ding)向到//www.yiehua.com/index.php?marker&id=nnnn,并且加(jia)了marker以(yi)及id=nnnn兩個(ge)(ge)變量,最后mod_rewrite就開(kai)始(shi)進(jin)行處理過程(cheng)。
第二次匹配(pei),marker被匹配(pei),所以忽(hu)略(lve)第一(yi)條規則,這里有一(yi)個“.”字符會(hui)出現在//www.yiehua.com/index.php?marker&id=nnnn中,所以第二條規則也會(hui)被忽(hu)略(lve),這樣我(wo)們就完成了。
注意,這個解決(jue)方案要求Apache的一(yi)些擴展(zhan)功能,所以(yi)如果(guo)你的網站放(fang)于在共享主(zhu)機中(zhong)會遇(yu)到很多障礙。
12.保證安全服務啟用
Apache可以(yi)用兩種(zhong)方(fang)法辨別你是(shi)否開啟了安全服務,分別引用{HTTPS}和(he){SERVER_PORT}變(bian)量:
復制代碼代碼如下:
RewriteCond %{REQUEST_URI} ^secure_page\.php$
RewriteCond %{HTTPS} !on
RewriteRule ^/?(secure_page\.php)$ //www.yiehua.com/$1 [R=301,L]
以(yi)上規則(ze)測(ce)試{REQUEST_URI}值是(shi)否等于我們(men)的安(an)(an)(an)全頁(ye)代碼,并且{HTTPS}不等于on。如果這兩個條件同時滿足,請求將(jiang)被重定向到安(an)(an)(an)全服務(wu)URI.另外你可(ke)用(yong){SERVER_PORT}做同樣的測(ce)試,443是(shi)常用(yong)的安(an)(an)(an)全服務(wu)端(duan)口
復制代碼代碼如下:
RewriteCond %{REQUEST_URI} ^secure_page\.php$
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(secure_page\.php)$ //www.yiehua.com/$1 [R=301,L]
13.在特定的頁面上強制執行安全服務
遇到同一個服務器根目錄下分別有一個安全服務域名和一個非安全服務域名,所以你就需要用RewriteCond 判斷安全服務端口是否占用,并且只將以下列表的頁面要求為安全服務:
復制代碼代碼如下:
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/?(page1|page2|page3|page4|page5)$ //www.yiehua.com/%1[R=301,L]
以下是怎(zen)樣(yang)將沒有設(she)置成安(an)全服(fu)務的(de)頁面(mian)返(fan)回到80端口:
復制代碼代碼如下:
RewriteCond %{ SERVER_PORT } ^443$
RewriteRule !^/?(page6|page7|page8|page9)$//www.yiehua.com%{REQUEST_URI} [R=301,L]
其實Rewrite里運用(yong)最多的還(huan)應該是正則(ze)表(biao)達式,如果了解點(dian)兒(er)正則(ze)的話,寫起這個規則(ze)還(huan)是比較簡單的。