深入理解document.referrer的用法


前言
在JavaScript中,document對象有很多屬性,其中有3個與對網頁的請求有關的屬性,它們分別是URL、domain和referrer。
URL屬性包含頁面完整的URL,domain屬性中只包含頁面的域名,而referrer屬性中則保存着鏈接到當前頁面的那個頁面的URL。
前面兩個很好理解,而referrer屬性簡單來說就是上一個頁面的URL。那么這個屬性具體有什么用處呢?
在H5頁面中,我們經常要在頭部加個返回上一個頁面按鈕,就像下面這樣的:

 
image.png

點擊左側的元素可以返回到上一個頁面,我們可以簡單寫一段JS代碼:

var back = document.getElementById('back'); //假設該返回按鈕元素id為back back.onclick = function(){ history.back(); //返回上一個頁面,也可以寫成history.go(-1) }; // 或者 <a id="back" href="javascript:history.back();" rel="external nofollow" ></a> 

咦?上面說了這么多,還是沒有說到document.referrer有什么用呀!別急,前面只是鋪墊,接下來步入正題~~~
雖說感覺上面這樣已經基本上實現了返回上一頁的功能,但是有一種情況沒有考慮到(我們程序員還是要嚴謹一點嘛),就是假如該頁面是別人分享過來的而不是通過其他頁面進入的呢?那么點擊該按鈕將不會有任何反應,因為此時history對象中不存在歷史記錄,也就是說這是你瀏覽器窗口打開時瀏覽的第一個頁面。
為了優化用戶體驗,這里通常有兩種解決方案。一種是在打開第一個頁面時不顯示返回上一頁按鈕,另一種是點擊直接跳轉到網站首頁,這可以根據產品需求來選擇合適的方案。
這里假設選擇第一種方案,我們可以這樣寫段JS:

if(document.referrer){ back.style.display = 'block'; //默認讓其隱藏,當referrer屬性不為空時讓其顯示 } //分享頁 返回上一頁 if (typeof document.referrer === '') { // 沒有來源頁面信息的時候,改成首頁URL地址 $('.jsBack').attr('href', '/'); } 

其實判斷當前頁面是否是用戶一開始打開的頁面,方法也不止通過判斷referrer屬性這一種方法,還可以通過history.length是否為零來判斷。
瀏覽器支持情況:

 
image.png

關於HTTPS請求
如果在一張普通的HTTP頁面上點擊了HTTPS的鏈接,那么在https請求頭部可以附上Referer信息,之后在HTTPS頁面中依然可以用document.referre來獲得普通的http頁面。

同樣,如果是在一張https頁面上點擊了另一個HTTPS的鏈接,可以在請求的頭部附上Referer信息。

但是如果是從一張https頁面點擊了http鏈接,那么很不幸,發送的http請求頭里無法包含關於https頁面的信息,這可能是出於一種對https頁面的保護措施。
偽造Referer信息
根據上文的描述,document.referre源自於Header中的Referer。那么如果想修改document.referre的值,理論上講,僅需要修改請求Header。可以將Header中現有的Referer替換成自己想要的值,如果原來沒有也可以添加Referer。

在客戶端,篡改Header是一件非常容易的事情。在一個頁面的http請求發出去之前,可以利用截包工具將其攔截,然后分析出頭部信息,並且修改Referre。

搜了一下,對於FireFox可以使用RefControl插件方便的進行修改。總之,欺騙Traffic source是輕而易舉的事情。

頁面強制Refresh

<meta http-equiv="Refresh" content="5;URL=a.html"> 

則過5秒后瀏覽器會自動向server發起a頁面請求。

經過測試,在IE8,FF3.6-FF4.0中,均不會帶有Referer信息,但是chrome卻能夠鬼使神差的把b.html作為Referer添加進頭部。
幾種意外丟失情況:
1,直接在瀏覽器中輸入地址
2,使用location.reload()刷新(location.href或者location.replace()刷新有信息)
3,在微信對話框中,點擊進入微信自身瀏覽器,
4,掃碼進入微信或QQ的瀏覽器
5,直接新窗口打開一個頁面
6,從https的網站直接進入一個http協議的網站(Chrome下親測),
7.a標簽設置rel="noreferrer"(兼容IE7+)
8,meta標簽來控制不讓瀏覽器發送referer
9,點擊 flash 內部鏈接
10,Chrome4.0以下,IE 5.5+以下返回空的字符串,使用 修改 Location 進行頁面導航的方法,會導致在IE下丟失 referrer,這可能是IE的一個BUG
11,跨域
12,iframe隱藏

結論:如果你需要通過 document.referrer 采集頁面訪問來源,最好不要使用 JS 跳轉或打開新窗口,也不要使用 meta 跳轉。
referrer 的作用:
1,統計來源,可以統計數量,可以拒絕訪問
2,返回上一頁邏輯判斷

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM