referrer
,以及如何通過Referrer Policy
去修改referrer
的值或者是顯示與否。什麼是referrer
當一個使用者點選當前頁面中的一個連結,然後跳轉到目標頁面時,目標頁面會收到一個資訊,即使用者是從哪個源連結跳轉過來的。如下圖所示:
referrer
欄位就說明了你是從哪個頁面發起該請求的。使用場景
有時候我們需要控制這個
referrer
欄位的值,即是否讓其顯示在請求頭中,或者是否顯示完整路徑等。尤其是在以下兩個使用場景:隱私
在社交網站的個人中心頁面,也許會存在一些外鏈,這時候社交網站肯定不希望使用者在點選這些連結跳轉到其他第三方網站時會將自己個人中心的URL資訊顯示在
referrer
欄位中傳過去,尤其是個人中心頁面的URL往往會帶著使用者資料和一些敏感資訊。這時候可以選擇不顯示來源頁面URL資訊或者只顯示一個網站根地址hostname。安全
有些使用了https的網站,可能在URL中使用一個引數(sid)來作為使用者身份憑證,而又需要引入其他https網站的資源,這種情況,網站肯定不希望洩露使用者的身份憑證資訊。當https網站需要引入不安全的http網站的資源或者有連結要跳轉到http網站時,這時候將https源網站的URL資訊傳過去也是不太安全的。
當然還有其他情況下需要referrer
的值,比如最近公司所做的專案中,有一個請求由於請求頭過大導致響應是400,我們的Referrer Policy
是預設的情況,顯示的referrer
是完整的URL資訊,該URL帶了很多敏感資料比如加密後的token,sessionID等,長度特別長,請求頭中的cookie和請求的URL也帶著很大塊的資訊,最終我們決定讓referrer
只攜帶網站根地址的資訊而不是其完整路徑,由此減小了header的大小。
Referrer-Policy
Referrer-Policy
的作用就是為了控制請求頭中referrer
的內容,目前是一個候選標準,不過已經有部分瀏覽器支援該標準。目前
Referrer-Policy
只包含以下幾種值:enum ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};複製程式碼
空字串
若設為空串則預設按照瀏覽器的機制設定
referrer
的內容,預設情況下是和no-referrer-when-downgrade
設定得一樣。no-referrer
不顯示
referrer
的任何資訊在請求頭中。no-referrer-when-downgrade
這是預設值。當從https網站跳轉到http網站或者請求其資源時(安全降級HTTPS→HTTP),不顯示
referrer
的資訊,其他情況(安全同級HTTPS→HTTPS,或者HTTP→HTTP)則在referrer
中顯示完整的源網站的URL資訊。same-origin
表示瀏覽器只會顯示
referrer
資訊給同源網站,並且是完整的URL資訊。所謂同源網站,是協議、域名、埠都相同的網站。origin
表示瀏覽器在
referrer
欄位中只顯示源網站的源地址(即協議、域名、埠),而不包括完整的路徑。strict-origin
該策略更為安全些,和
origin
策略相似,只是不允許referrer
資訊顯示在從https網站到http網站的請求中(安全降級)。origin-when-cross-origin
當發請求給同源網站時,瀏覽器會在
referrer
中顯示完整的URL資訊,發個非同源網站時,則只顯示源地址(協議、域名、埠)strict-origin-when-cross-origin
和
origin-when-cross-origin
相似,只是不允許referrer
資訊顯示在從https網站到http網站的請求中(安全降級)。unsaft-url
瀏覽器總是會將完整的URL資訊顯示在
referrer
欄位中,無論請求發給任何網站。Referrer-Policy更改方法
可以有以下5種方法:
1. 通過Referrer-Policy
HTTP header
設定:
Referrer-Policy: origin複製程式碼
2. 通過<meta>
元素改變Referrer Policy
,直接修改名為referrer
的內容
<meta name="referrer" content="origin">複製程式碼
3. 給 <a>
, <area>
, <img>
, <iframe>
, 或者<link>
元素設定referrerpolicy
屬性
<a href="http://example.com" referrerpolicy="origin">複製程式碼
4. 如需設定不顯示referrer
資訊時,也可以給 <a>
, <area>
, <link>
元素設定rel
的連結關係。
<a href="http://example.com" rel="noreferrer">複製程式碼
總結
使用何種
Referrer Policy
取決於網站的需求,但是一般來說,unsafe-url
是不太建議用的,同樣,如果是隻想顯示網站的根地址,那麼建議用strict-origin
和strict-origin-when-cross-origin
。如果URL中沒有什麼敏感資訊,那就預設使用no-referrer-when-downgrade
。