什麼是HTTP Referer
簡言之,HTTP Referer是header的一部分,當浏覽器向web服務器發送請求的時候,一般會帶上 Referer,告訴服務器我是從哪個頁面鏈接過來的,服務器籍此可以獲得一些信息用於處理。可以用於統 計訪問本網站的用戶來源,也可以用來防止盜鏈接(注意:用這種方法來防止盜鏈接有很大的局限性,因 為Header中的信息很容易偽造)。在.NET中取得該字段非常簡單,你只需要做如下調用即可: Request.UrlReferrer,該值返回的是一個Uri對象。值得注意的是,當你想獲取Url字符串的時候,最好 不要直接調用Request.UrlReferrer.ToString()方法,因為這樣有可能返回的是一堆亂碼。產生的原因是 ,用戶在來你網站之前的那個網站的編碼方式(Encoding)也許和你的網站不一樣,導致Url Decode的時 候出現了亂碼。這裡建議使用Request.UrlReferrer.OriginalString,這個屬性返回的就是當時構造Uri 對象的原始Url,即沒有經過Decode操作。當然,如果你只是想獲取Url字符串的話,還可以這樣調用: Request.Headers["Referer"]。但你得先判斷一下浏覽器是否發送了該值,如果沒有發送該值,則返回 null。(小提示:細心的人可能看出來了,在HTTP Header中Referer的不是英文單詞Referrer。Referer 其實應該是英文單詞Referrer,不過拼錯的人太多了,所以編寫標准的人也就將錯就錯了。但在.NET中修 改了這個錯誤,所以是Request.UrlReferrer,而不是Request.UrlReferer,使用的時候小心一點就是了 )
Referer不能正確獲取
Firefox中關於Referer的設置有兩個鍵值:network.http.sendRefererHeader (default=2) 設置 Referer的發送方式,0為完全不發送;1為部分發送;2為始終發送。我檢查了我的Firefox設置,明明設 置的是2啊,也就是說都要發送這個字段的,但我調試的時候發現Firefox確實沒有發送這個字段, Request.UrlReferrer始終為null。於是上網去找找有沒有解決的辦法,發現有很多人和我遇到了相同的 問題,但都沒有說明原因,也沒有找到合適的解決方案。在微軟的官方網站,好像有人提交了這個Bug, 請參考http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=103334 。搞了半天,微軟回復說沒法重現這個Bug。FT。。。除了Firefox外,其他幾個浏覽器IE,Safari,好像 都有這個問題。
查找解決辦法
在網上找了一陣,還是無果而終。於是我自己觀察了網站的訪問日志,發現並不是所有的Firefox的訪 問記錄Url Refferrer都是空的,有的確是正確的發送了信息的。我開始還懷疑是FF的版本問題,於是我 去下載了FF的最新版本3.0.8,裝上之後結果依然。看來不是版本的問題。我仔細想了一下,出現這樣的 情況無非有兩個原因:第一,FF沒有正確發送Refferrer到服務器;第二,FF正確發送了Refferrer,服務 器的.NET程序沒能正確截取該值。為了查看FF是否正確發送了Refferre,我用了一個網絡抓包工具,把FF 發送的數據抓回來分析了一番,驚奇的發現在FF發送的Header正確的發送了Refferrer。如下所示:
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.baidu.com/s?wd=%C3%C0%C3%FB%CC%DA
Cookie: ....
這樣一來,就徹底排除了FF沒有正確發送的問題。難道是Server沒能正確識別FF發送的Refferrer?我 開始還是有點懷疑的,可是仔細一想,除了Refferrer沒能正確處理以外,其他的Header都是正確的 啊,.NET不會傻到這種程度的,所以我覺得還是客服端在發送數據的時候出了問題。這時候,我突然想到 很多防火牆軟件會掃描網絡數據包。會不會是防火牆截斷了FF發送的Refferrer呢?我機器上是OEM的諾頓 防火牆,由於一直用諾頓,我對他還是有些好感的。為了驗證我的想法,我暫時關閉了諾頓的Internet監 控功能。重新試了一遍之前的訪問操作,驚奇的發現這次我的訪問記錄裡面正確提取了Refferrer。到這 裡,我大概就明白了,肯定是諾頓自動去掉了Header中的Refferrer信息!!這個時候,我重新測試了IE ,Safari等浏覽器,都能正確獲取Refferrer值了。到此為止,這個問題算是找到答案了,諾頓去掉了我 的浏覽器發送的Header中的Refferer信息!!我的問題是解決了,不知道網上其他那些遇到同樣問題的朋 友是否也是防火牆的原因。希望我的經歷對此有些幫助。
最後,由於我在找原因的過程中,發現有的朋友敘述的問題與我的還不完全一樣,他們的是IE能正確 提取Refferrer,而FF卻不行,這個時候請你看看的FF設置是否有問題,即 network.http.sendRefererHeader的值是否設置為2。