什麼是Referer? Referer是HTTP請求頭信息裡面的一個常見欄位,它提供了訪問來源的信息。比如說,在某網站上看到一個廣告並點了進去,那麼我就可能會在HTTP 協議在請求(request)的頭信息裡面看到Referer這一欄位給出“引薦網頁”的URL,讓人知道我們是通過“某網站”進入的這個 ...
什麼是Referer?
Referer是HTTP請求頭信息裡面的一個常見欄位,它提供了訪問來源的信息。比如說,在某網站上看到一個廣告並點了進去,那麼我就可能會在HTTP 協議在請求(request)的頭信息裡面看到Referer這一欄位給出“引薦網頁”的URL,讓人知道我們是通過“某網站”進入的這個廣告頁。
Referer存在的條件
在瀏覽器向伺服器請求資源的時候,Referer欄位並不是總是存在的,其中在以下幾種情況中會發送Referer欄位。
1.點擊網頁上的連接
2.提交表單(post或get)
3.網頁載入靜態資源,比如載入圖片、腳本、樣式(js的script標簽及html中img標簽的src屬性)。
以下是幾種獲取不到Referer的幾種情況
1.直接在瀏覽器內輸入URL
2.通過瀏覽器內的書簽或收藏
3.第三方軟體內容中的連接(如Word,Excel等)
4.從HTTPS的網站跳轉到HTTP的網站或SSL認證網站跳入
那麼Referer有什麼作用呢?
1.通過Referer我們可以知道訪問來源的信息,所以可以用來做一些網站流量的來路統計
2.防止圖片盜鏈,當我們不希望自家網站圖片外鏈被其他網站載入時,就可以基於Referer欄位來實現,可以通過判斷該欄位是否是自家URL或者是屬於白名單里的URL如果是則放行允許載入。
3.在某些情境下我們不希望暴露當前的原始網址,比如一個社交網站會有每個用戶的簡介頁面,用戶會在他們的個人主頁中添加一些鏈接。社交網站可能不希望泄露用戶的個人主頁URL給被鏈接的網站(因為個人主頁URL可能會泄露其主人的身份信息)。
一些社交網站可能想通知其他網站該鏈接是從社交網站發起的,但不想泄露包含用戶信息的鏈接(例如,微博中的鏈接希望告訴對方該鏈接是在微博中連接過來的,但不希望告訴對方從誰的微博連接過來)。
referrer策略
Referrer策略包含以下值:
- 空字元串:空字元串表示沒有referrer策略,預設為no-referrer-when-downgrade。
- no-referrer:最簡單的策略是“no-referrer”,表示所有的請求都不帶referrer。
- no-referrer-when-downgrade:主要針對於受TLS保護的URL(如https),簡單的說就是https的頁面中,當連接的資源也是https的,則發送完整的referrer,如果連接的資源是http的,就不發送referrer
- same-origin:對於同源的鏈接,會發送referrer,其他的不會。
- origin:這個策略對於任何資源來說只發送源的信息,不發送完整的url。
- strict-origin:這個策略類似於origin和no-referrer-when-downgrade的合體,如果一個https頁面中鏈接到http的頁面或資源,則不會發送referrer。http頁面鏈接以及https鏈接到https都只發送來源頁面的源信息。
- origin-when-cross-origin:該策略在同源的鏈接中發送完整的URL,其他情況僅發送源信息。相同的功能變數名稱,http和https協議被認為是非同源的。
- strict-origin-when-cross-origin:對於同源請求,發送完整的URL;對於同為https的,只發送源信息;對於http頁面只發送源信息;https頁面中的http請求不發送referrer。
- unsafe-url:這個主要是解決https頁面中的http資源不發referrer的問題,它會使在https頁面中http資源發送完整的referrer。
Referrer策略可以通過以下方法聲明:
1.通過http請求頭中的Referrer-Policy欄位,例:Referrer-Policy: no-referrer
2.通過meta標簽,name為referrer,例:<meta name=”referrer” content=”no-referrer” />
3.通過<a>、<area>、<img>、<iframe>、<link>元素的referrerpolicy屬性。例:<a href=“http://example.com” referrerpolicy=“origin”>
4.通過<a>、<area><link>元素的rel=noreferrer屬性,例:<a href='http://example.com' rel="noreferrer" target="_blank">test</a>
5.通過隱式繼承
註意事項
Referrer策略還有其他歷史遺留的值:
1.never等價於no-referrer
2.default等價於no-referrer-when-downgrade
3.always等價於unsafe-url
4.不建議使用上面三個值,建議使用後面的新值
相容性
IE:不支持(IE高版本中隱式支持default,https頁面拉取的http資源不會加referrer)
Edge:僅支持較早版本的值(never、always、origin、default)
Firefox:36+
Chrome:21+
Safari:7.1+(僅支持較早版本的4個值)
Opera:15+
iOS Safari:8+(僅支持較早版本的4個值)
參考:
http://www.ruanyifeng.com/blog/2019/06/http-referer.html
https://blog.lyz810.com/article/2016/08/referrer-policy-and-anti-leech/
https://blog.csdn.net/fjb2080/article/details/80975115