摘要:如果你的服務(wù)器提供某些資源的下載,那么你就必須多加小心諸如迅雷等下載軟件,因為它們可能把你網(wǎng)站資源吸干,并且影響你的正常訪客訪問。
目錄
一、準備開始:mod_rewrite
二、利用.htaccess實現(xiàn)URL重寫(rewrite)與URL重定向(redirect)
將.htm頁面映射到.php
臨時重定向(R=302)與永久重定向(R=301)
為什么要用重定向?——重定向和URL重寫的區(qū)別
長短地址轉(zhuǎn)換
去掉www
加上www
支持多域名訪問
三、改寫查詢字符串QUERY_STRING
利用QSA轉(zhuǎn)換查詢字符串QUERY_STRING
利用RewriteCond改寫查詢字符串QUERY_STRING
QSA與RewriteCond雙劍齊發(fā)
剝離查詢字符
四、利用RewriteCond和RewriteRule進行訪問控制
文件訪問控制
用.htaccess阻止User-agent
用.htaccess阻止盜鏈(hot-linking)
References
URL重定向是.htaccess的重頭戲,它可以將長地址轉(zhuǎn)為短地址、將動態(tài)地址轉(zhuǎn)為靜態(tài)地址、重定向丟失的頁面、防止盜鏈、實現(xiàn)自動語言轉(zhuǎn)換等。筆者覺得難點是在正則表達式的運用和理解上。有關(guān)htaccess的正則表達式用法,請查閱本站《.htaccess正則表達式》一文。
一、準備開始:mod_rewrite
實現(xiàn)所有這些神奇功能的模塊叫做mod_rewrite,請確保你的服務(wù)器安裝并啟用了該模塊:
sudo a2enmod rewrite
我們一般會把所有涉及URL重寫或者重定向的代碼這樣放置:
# Turn on rewrite engine Options +FollowSymlinks RewriteEngine on # More rules below ...
一些我們需要注意的地方:
FollowSymlinks必須啟用,這是rewrite引擎的安全需求。
通常FollowSymlinks在Apache的主配置文件中就已經(jīng)啟用了,所以通??梢允÷?。
RewriteEngine命令用于啟用rewrite引擎
IfModule命令用于判斷Apache是否安裝了mod_rewrite模塊,之后筆者會省略該命令,但不代表這是個好習慣。
mod_rewrite會處理所有提交給Apache的URL請求,并與之后的規(guī)則進行匹配
下面我們開始講解一些例子。
二、利用.htaccess實現(xiàn)URL重寫(rewrite)與URL重定向(redirect)
1.將.htm頁面映射到.php
Options +FollowSymlinks RewriteEngine on RewriteRule ^(.*).htm$ $1.php [NC]
注意事項:
該RewriteRule能夠?qū)?htm靜態(tài)頁面映射到.php動態(tài)頁面
如果通過.htm進入,瀏覽器地址欄顯示的是.htm擴展名,但服務(wù)器上實際執(zhí)行的是.php
必須保證服務(wù)器上有對應(yīng)的.php,否則會404
瀏覽器和搜索引擎可以同時通過.htm和.php訪問網(wǎng)頁
如果該目錄上存在.htm,將被忽略
[NC]表示“不區(qū)分大小寫”,更多類似定義請參考本站《.htaccess正則表達式》一文
2.臨時重定向(R=302)與永久重定向(R=301)
RewriteEngine on RewriteBase / RewriteRule ^(.*).htm$ $1.php [R,NC,L]
注意事項:
該RewriteRule能夠?qū)?htm靜態(tài)頁面重定向到.php動態(tài)頁面
如果通過.htm進入,瀏覽器地址欄會自動轉(zhuǎn)為.php,這也是重定向的本質(zhì)
必須保證服務(wù)器上有對應(yīng)的.php,否則會404
瀏覽器和搜索引擎可以同時通過.htm和.php訪問網(wǎng)頁
如果該目錄上存在.htm,將被忽略
RewriteBase定義了重寫基準目錄。
例如,如果你將虛擬站點設(shè)置在/var/www目錄下,刪除這行將會導致重定向到http://yourdomain.com/var/www/1.php。顯然這是找不到的,而且你也不會希望用戶看見你的服務(wù)器的目錄結(jié)構(gòu)。
再舉個例子,如果RewriteBase /base/,那么將會重定向到http://yourdomain.com/base/1.php。
對于重寫基準目錄,我們還可以通過將$1.php變成/$1.php實現(xiàn)直接變換,這時就可以將RewriteBase省略。
字母R表示臨時重定向,相當于[R=302,NC]。關(guān)于重定向代碼,請參考本站《HTTP協(xié)議重定向編碼》
字母L表示如果能匹配本條規(guī)則,那么本條規(guī)則是最后一條(Last),忽略之后的規(guī)則。
在討論R=302臨時重定向后,理解R=301永久重定向也就容易多了:
RewriteEngine on RewriteRule ^(.*)$ http://newdomain.com/$1 [R=301,NC,L]
這個規(guī)則告訴瀏覽器和搜索引擎,網(wǎng)站地址發(fā)生了永久性變更,用戶的URL請求將會被發(fā)送給新的域名(主機)處理。
由于是重定向到新的主機地址,RewriteBase也就沒有出現(xiàn)的必要了。
3.為什么要用重定向?——重定向和URL重寫的區(qū)別
通過重定向,瀏覽器知道頁面位置發(fā)生變化,從而改變地址欄顯示的地址
通過重定向,搜索引擎意識到頁面被移動了,從而更新搜索引擎索引,將原來失效的鏈接從搜索結(jié)果中移除
臨時重定向(R=302)和永久重定向(R=301)都是親搜索引擎的,是SEO的重要技術(shù)
URL重寫用于將頁面映射到本站另一頁面,若重寫到另一網(wǎng)絡(luò)主機(域名),則按重定向處理
4.長短地址轉(zhuǎn)換
利用URL重寫,我們可以很方便地實現(xiàn)長短地址的轉(zhuǎn)換,但是用重定向就不合適了。
RewriteEngine On RewriteRule ^grab /public/files/download/download.php
若訪問
http://mysite/grab?file=my.zip
則會執(zhí)行該頁面:
http://mysite/public/files/download/download.php?file=my.zip
5.去掉www
Options +FollowSymlinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www.(.*) [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,NC,L]
6.加上www
RewriteEngine On RewriteCond %{HTTP_HOST} ^(.*)$ RewriteRule (.*) http://www.%1/$1 [R=301,L]
7.支持多域名訪問
如果你不湊巧買到了不支持多域名的主機,那么.htaccess或許可以幫助你。現(xiàn)在假設(shè)你有域名domain-one.com和domain-two.com,并且在服務(wù)器根目錄有對應(yīng)文件夾one和two,那么通過下面的改寫就能讓Apache同時接受者兩個域名的請求:
#two domains served from one root.. RewriteCond %{HTTP_HOST} domain-one.com RewriteCond %{REQUEST_URI} !^/one RewriteRule ^(.*)$ /one/$1 [L] RewriteCond %{HTTP_HOST} domain-two.com RewriteCond %{REQUEST_URI} !^/two RewriteRule ^(.*)$ /two/$1 [L]
三、改寫查詢字符串QUERY_STRING
查詢字符串是指URL請求中“問號”后面的部分。比如,http://mysite/grab?foo=bar中粗體部分就是查詢字符串,其中變量名是foo,值是bar。
1.利用QSA轉(zhuǎn)換查詢字符串QUERY_STRING
QSA標志( Query String Appending)用于在URI中截取查詢字符串,這個截取操作是通過小括號正則表達式實現(xiàn)的:
RewriteEngine On RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
將會把請求/pages/123?one=two 映射到 /page.php?page=123&one=two
注意粗體部分幾乎是相同的,除了“問號”變成了“與”符號
如果沒有QSA標志,那么會映射到/page.php?page=123。
如果沒有用到小括號正則表達式,就不需要QSA,這在上節(jié)“長短地址轉(zhuǎn)換”中已經(jīng)例證過了。
小括號正則表達式可以截取查詢字符串中的內(nèi)容,但是如果沒有開啟QSA標志,那么在/page.php?page=$1中“問號”之后將會被剝離丟棄。這種特性可以用于實現(xiàn)“剝離查詢字符串”
通過QSA,我們可以將簡單鏈接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link
RewriteEngine On RewriteRule ^/([^/]+)/([^/]+)/? /index.php?first-var=$1&second-var=$2 [QSA]
2.利用RewriteCond改寫查詢字符串QUERY_STRING
RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.*) RewriteRule ^grab(.*) /page.php?bar=%1
該規(guī)則將訪問請求http://mysite/grab?foo=bar轉(zhuǎn)換為http://mysite/page.php?bar=bar
RewriteCond用于捕獲查詢字符串(QUERY_STRING)中變量foo的值,并存儲在%1中
QUERY_STRING是Apache定義的“變量=值”向量(數(shù)組)
3.QSA與RewriteCond雙劍齊發(fā)
RewriteEngine On RewriteCond %{QUERY_STRING} foo=(.+) RewriteRule ^grab/(.*) /%1/index.php?file=$1 [QSA]
會把/grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar
轉(zhuǎn)換后根目錄是bar目錄
foobar.zip?level=5中的“問號”變成了foobar.zip&level=5中的“與”符號
4.剝離查詢字符串
只需在要開始剝離的鏈接后面加個“問號”,并且不要啟用QSA標志,就可剝離查詢字符串
RewriteEngine On # Whatever QS is RewriteCond %{QUERY_STRING} . # I don"t want it with Question mark RewriteRule foo.php(.*) /foo.php? [L]
四、利用RewriteCond和RewriteRule進行訪問控制
我們在第一篇.htaccess基礎(chǔ)中提到了很多有用的訪問控制方法,其實通過Rewrite也能實現(xiàn)類似的功能,而且可以更強大!
1.文件訪問控制
之前利用Order、Files及FilesMatch命令實現(xiàn)的訪問控制可以滿足大部分要求,但是當用戶被拒絕時,他們看到的是碩大的“403 Forbidden”,如果你不想傷害用戶的感情,就需要顯示一些別的東西,通過Rewrite就可以實現(xiàn)這個特性:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !^(.+).css$ RewriteCond %{REQUEST_FILENAME} !^(.+).js$ RewriteCond %{REQUEST_FILENAME} !special.zip$ RewriteRule ^(.+)$ /chat/ [NC]
該規(guī)則將僅允許用戶請求.css, .js類型的文件,還有special.zip文件
RewriteRule 后面指定了限制規(guī)則:映射到/char/目錄下處理
RewriteCond 后面的“感嘆號”(!)起到了“否定”作用,它表明,對不滿足后面正則表達式者應(yīng)用RewriteRule規(guī)則,也就是對當前類型的文件將不應(yīng)用規(guī)則
RewriteCond 之間是以邏輯“與”連接的,也就是只有當三個條件都不滿足時才執(zhí)行RewriteRule
該規(guī)則也會限制訪問.htm, .jpg等格式
該規(guī)則不可以放在虛擬站點根目錄(/)下,否則會死循環(huán)
如果是二級目錄,如/test/,那么傳入RewriteCond的參數(shù)是以/test/開始的,因此從(.+)獲得的文件名也含有/test/,讀者必須對此多加小心
要想僅獲得文件名,可以將(.+)替換成(1+),并且去掉符號^,如下所示:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !([^/]+).css$ RewriteCond %{REQUEST_FILENAME} !([^/]+).js$ RewriteRule ^(.+)$ /chat/ [NC]
2.用.htaccess阻止User-agent
什么是User-agent?User-agent用于瀏覽器向服務(wù)器“自報家門”,更確切的說是所有HTTP客戶端都得用User-agent向服務(wù)器“自報家門”,以便服務(wù)器對不同的客戶端作出不同響應(yīng)。比如,某站點可能需要對瀏覽器、搜索引擎crawl還有各類下載工具作出不同的響應(yīng)。服務(wù)器就是通過所謂的User-agent進行區(qū)分的。
如果你的服務(wù)器提供某些資源的下載,那么你就必須多加小心諸如“迅雷”等下載軟件,因為它們可能把你網(wǎng)站資源吸干,并且影響你的正常訪客訪問。為此,我們可以利用Rewrite限制某些UA的訪問:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC] RewriteRule . abuse.txt [L]
該規(guī)則限制“迅雷”客戶端下載資源,并將下載文件重置到abuse.txt
HTTP_USER_AGENT是Apache的內(nèi)置變量
2.0.50727是迅雷User-agent的特征字符串
RewriteRule后面的“點”表示“任意URI”,也就是不管請求的是什么,都輸出abuse.txt
通常,我們不會僅限制一個UA。利用[OR]即可實現(xiàn)對多個UA作出統(tǒng)一處理:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 2.0.50727 [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR] # etc.. RewriteCond %{HTTP_USER_AGENT} ^Net Vampire [NC] RewriteRule . abuse.txt [L]
3.用.htaccess阻止盜鏈(hot-linking)
盜鏈,特別是圖片,是非常可恥的!哪怕將圖片復制到自己服務(wù)器上,也比盜用他人的圖片鏈接來得光彩?。ㄍ略阃戤叄?br>.htaccess的Rewrite功能可以提供非常簡單、有效的方法阻止這種可恥行為:
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www.)?lesca.me/ [NC] RewriteCond %{REQUEST_URI} !hotlink.png [NC] RewriteRule .*.(gif|jpg|png)$ /hotlink.png [NC]
轉(zhuǎn)自:http://lesca.me/archives/htaccess-rewrite.html
/ ?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21400.html
摘要:如果你的服務(wù)器提供某些資源的下載,那么你就必須多加小心諸如迅雷等下載軟件,因為它們可能把你網(wǎng)站資源吸干,并且影響你的正常訪客訪問。 目錄一、準備開始:mod_rewrite 二、利用.htaccess實現(xiàn)URL重寫(rewrite)與URL重定向(redirect) 將.htm頁面映射到.php 臨時重定向(R=302)與永久重定向(R=301) 為什么要用重定向?——重定向和URL...
摘要:服務(wù)器市場份額。子進程負責創(chuàng)建由指令設(shè)置的服務(wù)器線程,同時還負責監(jiān)聽接收到的請求,并將請求分發(fā)給處理線程。在版本引入了模塊,這個模塊基于模塊創(chuàng)建的,并加入了獨立的監(jiān)聽線程來管理請求處理完成后的休眠的連接?;谑录姆?wù)器完勝。 譯文首發(fā)于 Apache 與 Nginx 性能對比:Web 服務(wù)器優(yōu)化技術(shù),轉(zhuǎn)載請注明出處。 多年前 Apache 基金會 Web 服務(wù)器 簡稱「Apache」...
摘要:服務(wù)器市場份額。子進程負責創(chuàng)建由指令設(shè)置的服務(wù)器線程,同時還負責監(jiān)聽接收到的請求,并將請求分發(fā)給處理線程。在版本引入了模塊,這個模塊基于模塊創(chuàng)建的,并加入了獨立的監(jiān)聽線程來管理請求處理完成后的休眠的連接?;谑录姆?wù)器完勝。 譯文首發(fā)于 Apache 與 Nginx 性能對比:Web 服務(wù)器優(yōu)化技術(shù),轉(zhuǎn)載請注明出處。 多年前 Apache 基金會 Web 服務(wù)器 簡稱「Apache」...
閱讀 2196·2021-11-19 09:55
閱讀 2661·2021-11-11 16:55
閱讀 3190·2021-09-28 09:36
閱讀 1958·2021-09-22 16:05
閱讀 3296·2019-08-30 15:53
閱讀 1818·2019-08-30 15:44
閱讀 2910·2019-08-29 13:10
閱讀 1354·2019-08-29 12:30