iT邦幫忙

0

document.referrer 跟想像中不太一樣

  • 分享至 

  • xImage

專案中有個需求,是希望可以知道前一頁的路徑,再來決定這一頁的樣式
這邊我希望可以透過 document.referrer 去取得到前一頁相關的資訊,不過好像跟預期的不太一樣

例如:

  1. 從 React 官網連結到 Vue 官網,document.referrer 是 ''(沒有換Tab)
  2. 專案中點擊下一頁開新視窗,新視窗的 document.referrer 是自己的網址 (有換Tab)

請問各位大大,是我的使用方式不對,還是 document.referrer 不是這樣使用呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
Felix
iT邦研究生 2 級 ‧ 2023-07-28 04:54:07
最佳解答

我相信 React 官網不會出現 Vue 官網的連結。


首先,必須要理解如何才能讓瀏覽器發送 Referer 標頭。如果認為 Referer 標頭是上一頁的網址,就大錯特錯了。

只有透過上一頁導向的網頁,瀏覽器才會發送 Referer 標頭至下一頁。

舉例來說,點擊連結、提交表單和引用檔案(如 img 標籤)都能讓當前網頁導向至下一頁,瀏覽器也就會發送 Referer 標頭至下一頁。然而,直接在網址列輸入網址就不行,因為和當前網頁沒有關係。

我想個案應該就是屬於後者,因為無法由 React 官網導向至 Vue 官網(沒有 Vue 官網的連結、表單或檔案)。

順帶一提,如果上一頁的 Referrer-Policy 標頭是 no-referrer 訊息,瀏覽器也不會發送 Referer 標頭至下一頁。

看更多先前的回應...收起先前的回應...
janlin002 iT邦好手 1 級 ‧ 2023-07-28 09:05:52 檢舉

感謝你詳細的回答,不過我想知道如果在react官網中切換不同章節,為什麼 document.referrer 是 'https://www.google.com/' ?

是因為 domain 沒有變動的情況下,都認定為同一頁嗎?

Felix iT邦研究生 2 級 ‧ 2023-07-28 15:23:49 檢舉

標頭是網頁的一部分,只有在客戶端發送或伺服器端回應 HTTP 請求時才會有標頭訊息。換句話說,切換章節仍然是在同一頁(沒有載入網頁的行為),因此網頁的標頭也就不會更新。

至於同網域的網頁會發送 Referer 標頭嗎?這個就要視剛才說的 Referrer-Policy 標頭而定。

如果瀏覽器版本較舊(如 Chrome 85 前),瀏覽器預設 Referrer-Policy 標頭為 no-referrer-when-downgrade 訊息,亦即網頁的 Referer 標頭會是上一頁的完整網址(含查詢字串);如果瀏覽器版本較新(如 Chrome 85 後),瀏覽器預設 Referrer-Policy 標頭為 strict-origin-when-cross-origin 訊息,亦即跨網域的網頁只會有上一頁的來源,也就是 HTTP 或 HTTPS 協議、主機名稱(網域名稱或 IP 位址)和連接埠號碼,不會有網頁路徑。

janlin002 iT邦好手 1 級 ‧ 2023-07-28 15:54:47 檢舉

那我想問一下:
如果是另開視窗,為什麼他的 document.referrer會顯示 開完的視窗網址呢?
例如:
A頁點擊按鈕另開了B頁,為什麼B頁的document.referrerc會顯示自己的網址呢?按照上面所說應該也是顯示A頁的document.referrerc吧?

Felix iT邦研究生 2 級 ‧ 2023-07-28 16:16:48 檢舉

可能是 B 頁自己又導向至自己一次(甚至好幾次)。

表面上看起來是從 A 頁導向至 B 頁,但是實際上是從 A 頁導向至 B 頁,然後 B 頁基於某個目的又導向至 B 頁(不同於重新整理)。這個目的可能是自動切換語言或整理 Cookie 資料等原因,但是客戶端通常都不會知道。

janlin002 iT邦好手 1 級 ‧ 2023-07-28 16:34:24 檢舉

瞭解,謝謝你的回答,有比較清楚~~

我要發表回答

立即登入回答