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