什么是HTTP Referer 簡(jiǎn)言之,HTTP Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁(yè)面鏈接過(guò)來(lái)的,服務(wù)器籍此可以獲得一些信息用于處理。比如從我主頁(yè)上鏈接到一個(gè)朋友那里,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶(hù)點(diǎn)擊我主頁(yè)上的鏈接訪(fǎng)問(wèn)他的網(wǎng)站。 Referer其實(shí)應(yīng)該是英文單詞Referrer,不過(guò)拼錯(cuò)的人太多了,所以編寫(xiě)標(biāo)準(zhǔn)的人也就將錯(cuò)就錯(cuò)了。 我的問(wèn)題 我剛剛把feed閱讀器改變?yōu)镚regarius,但他不像我以前用的liferea,訪(fǎng)問(wèn)新浪博客的時(shí)候,無(wú)法顯示其中的圖片,提示“此圖片僅限于新浪博客用戶(hù)交流與溝通”,我知道,這就是HTTP Referer導(dǎo)致的。 由于我上網(wǎng)客戶(hù)端配置的特殊性,首先懷疑是squid的問(wèn)題,但通過(guò)實(shí)驗(yàn)排除了,不過(guò)同時(shí)發(fā)現(xiàn)了一個(gè)Squid和Tor、Privoxy協(xié)同使用的隱私泄露問(wèn)題,留待以后研究。 Gregarius能處理這個(gè)問(wèn)題么? 答案是否定的,因?yàn)镚regarius只是負(fù)責(zé)輸出html代碼,而對(duì)圖像的訪(fǎng)問(wèn)是有客戶(hù)端瀏覽器向服務(wù)器請(qǐng)求的。 不過(guò),安裝個(gè)firefox擴(kuò)展也許能解決問(wèn)題,文中推薦的”Send Referrer”我沒(méi)有找到,但發(fā)現(xiàn)另外一個(gè)可用的:”RefControl“,可以根據(jù)訪(fǎng)問(wèn)網(wǎng)站的不同,控制使用不同的Referer。 但是我不喜歡用Firefox擴(kuò)展來(lái)解決問(wèn)題,因?yàn)槲矣X(jué)得他效率太低,所以我用更好的方式——Privoxy。 Privoxy真棒 在Privoxy的default.action中添加兩行: {+hide-referrer{forge}} .album.sina.com.cn 這樣Gregarius中新浪博客的圖片就出來(lái)了吧?+hide-referrer是Privoxy的一個(gè)過(guò)濾器,設(shè)置訪(fǎng)問(wèn)時(shí)對(duì)HTTP Referer的處理方式,后面的forge代表用訪(fǎng)問(wèn)地址當(dāng)作Refere的,還可以換成block,代表取消Referer,或者直接把需要用的Referer網(wǎng)址寫(xiě)在這里。 用Privoxy比用Firefox簡(jiǎn)單的多,趕緊換吧。 From https to http 我還發(fā)現(xiàn),從一個(gè)https頁(yè)面上的鏈接訪(fǎng)問(wèn)到一個(gè)非加密的http頁(yè)面的時(shí)候,在http頁(yè)面上是檢查不到HTTP Referer的,比如當(dāng)我點(diǎn)擊自己的https頁(yè)面下面的w3c xhtml驗(yàn)證圖標(biāo)(網(wǎng)址為http://validator.w3.org/check?uri=referer),從來(lái)都無(wú)法完成校驗(yàn),提示: No Referer header found! 原來(lái),在http協(xié)議的rfc文檔中有定義: 復(fù)制代碼 代碼如下: 15.1.3 Encoding Sensitive Information in URI's Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if the referring page was transferred with a secure protocol. 這樣是出于安全的考慮,訪(fǎng)問(wèn)非加密頁(yè)時(shí),如果來(lái)源是加密頁(yè),客戶(hù)端不發(fā)送Referer,IE一直都是這樣實(shí)現(xiàn)的,F(xiàn)irefox瀏覽器也不例外。但這并不影響從加密頁(yè)到加密頁(yè)的訪(fǎng)問(wèn)。 Firefox中關(guān)于Referer的設(shè)置 都在里,有兩個(gè)鍵值: network.http.sendRefererHeader (default=2) 設(shè)置Referer的發(fā)送方式,0為完全不發(fā)送,1為只在點(diǎn)擊鏈接時(shí)發(fā)送,在訪(fǎng)問(wèn)頁(yè)面中的圖像什么的時(shí)候不發(fā)送,2為始終發(fā)送。參見(jiàn)Privacy Tip #3: Block Referer Headers in Firefox network.http.sendSecureXSiteReferrer (default=true) 設(shè)置從一個(gè)加密頁(yè)訪(fǎng)問(wèn)到另外一個(gè)加密頁(yè)的時(shí)候是否發(fā)送Referer,true為發(fā)送,false為不發(fā)送。
利用Referer防止圖片盜鏈
雖然Referer并不可靠,但用來(lái)防止圖片盜鏈還是足夠的,畢竟不是每個(gè)人都會(huì)修改客戶(hù)端的配置。實(shí)現(xiàn)一般都是通過(guò)apache的配置文件,首先設(shè)置允許訪(fǎng)問(wèn)的地址,標(biāo)記下來(lái): # 只允許來(lái)自don.com的訪(fǎng)問(wèn),圖片可能就放置在don.com網(wǎng)站的頁(yè)面上 SetEnvIfNoCase Referer "^http://www.don.com/" local_ref # 直接通過(guò)地址訪(fǎng)問(wèn) SetEnvIf Referer "^$" local_ref 然后再規(guī)定被標(biāo)記了的訪(fǎng)問(wèn)才被允許: 復(fù)制代碼 代碼如下: FilesMatch ".(gif|jpg)" Order Allow,Deny Allow from env=local_ref /FilesMatch 或者 復(fù)制代碼 代碼如下: Directory /web/images Order Deny,Allow Deny from all Allow from env=local_ref /Directory