Host - 請(qǐng)求頭
指明了請(qǐng)求的服務(wù)器的域名/ip 地址和端口號(hào)
組成:域名+端口號(hào)
如果沒有給定端口號(hào),會(huì)自動(dòng)使用被請(qǐng)求服務(wù)的默認(rèn)端口(比如請(qǐng)求一個(gè) HTTP 的 URL 會(huì)自動(dòng)使用 80 端口)。
HTTP/1.1 的所有請(qǐng)求報(bào)文中必須包含一個(gè) Host 頭字段。如果一個(gè) HTTP/1.1 請(qǐng)求缺少 Host 頭字段或者設(shè)置了超過一個(gè)的 Host 頭字段,一個(gè) 400(Bad Request)狀態(tài)碼會(huì)被返回。
用途
主要應(yīng)用在虛擬主機(jī)技術(shù)上。同一個(gè) IP 也可以設(shè)置多個(gè)不同站點(diǎn),那么訪問不同的域名都轉(zhuǎn)發(fā)到同一 IP ,怎么區(qū)分這些不同的站點(diǎn)呢,就是用的 Host 字段。這樣每次訪問都會(huì)根據(jù)不同的 Host 的信息請(qǐng)求到不同的站點(diǎn)上面。
比如說有一臺(tái) ip 地址為 11.11.11.11 的服務(wù)器,在這臺(tái)服務(wù)器上部署著淘寶、京東、拼多多的網(wǎng)站,并且配置了三個(gè)虛擬主機(jī):a.com, b.com, c.com, 這三個(gè)域名都指向 11.11.11.11。 當(dāng)我們?cè)L問 c.com 的網(wǎng)站時(shí),看到的是拼多多的頁面而不是淘寶和京東的頁面,原因就是 Host 請(qǐng)求頭決定著訪問哪個(gè)虛擬主機(jī)。
referer - 請(qǐng)求頭
Referer 首部包含了當(dāng)前請(qǐng)求頁面的來源頁面的地址,即表示當(dāng)前頁面是通過此來源頁面里的鏈接進(jìn)入的。
組成:協(xié)議+域名+端口號(hào)+路徑+參數(shù)(注意,不包含 hash 值)
需要注意的是 referer 實(shí)際上是 "referrer" 誤拼寫。
在以下幾種情況下,Referer 不會(huì)被發(fā)送:
- 來源頁面采用的協(xié)議為表示本地文件的 "file" 或者 "data" URI;
- 當(dāng)前請(qǐng)求頁面采用的是非安全協(xié)議,而來源頁面采用的是安全協(xié)議(HTTPS);
- 直接輸入網(wǎng)址或通過瀏覽器書簽訪問;
- 使用 JavaScript 的 Location.href 或者是 Location.replace();
- 使用 html5 中 noreferrer
用途
服務(wù)端一般使用 Referer 首部識(shí)別訪問來源,可能會(huì)以此進(jìn)行統(tǒng)計(jì)分析、日志記錄以及緩存優(yōu)化等,還有個(gè)常見的用途是圖片防盜鏈。
防盜鏈原理是:當(dāng)用戶訪問網(wǎng)頁時(shí),referer 就是前一個(gè)網(wǎng)頁的 URL;如果是圖片的話,通常指的就是圖片所在的網(wǎng)頁。當(dāng)瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),referer 就自動(dòng)攜帶在 HTTP 請(qǐng)求頭了。圖片服務(wù)器根據(jù)這個(gè)請(qǐng)求頭判斷,如果 referer 不是自己的服務(wù)器,就將其攔截。
但是 referrer 存在很多問題。比如說在請(qǐng)求外部網(wǎng)站的時(shí)候,攜帶著 url 的很多參數(shù)信息,而這些信息實(shí)際上是隱私的,所以存在一定的隱私暴露風(fēng)險(xiǎn)。 下面的 origin 就不存在這種隱私問題。
origin - 請(qǐng)求頭
請(qǐng)求首部字段 Origin 指示了請(qǐng)求來自于哪個(gè)站點(diǎn)。該字段僅指示服務(wù)器名稱,并不包含任何路徑信息。除了不包含路徑信息,該字段與 Referer 首部字段相似。
該首部用于 CORS 請(qǐng)求或者 POST 請(qǐng)求。
組成:協(xié)議+域名+端口號(hào)
注意:只有跨域請(qǐng)求(可以看到 response 有對(duì)應(yīng)的 header:Access-Control-Allow-Origin),或者同域時(shí)發(fā)送 post 請(qǐng)求,才會(huì)攜帶 origin 請(qǐng)求頭。
如果瀏覽器不能獲取請(qǐng)求源,那么 origin 滿足上面情況也會(huì)攜帶,不過其值為 null。
而 referer 不論何種情況下,只要瀏覽器能獲取到請(qǐng)求源都會(huì)攜帶。如果瀏覽器如果不能獲取請(qǐng)求源,那么請(qǐng)求頭中不會(huì)攜帶 referer。
用途
用于 CORS: 當(dāng)我們的瀏覽器發(fā)出跨站請(qǐng)求時(shí),服務(wù)器會(huì)校驗(yàn)當(dāng)前請(qǐng)求是不是來自被允許的站點(diǎn)。服務(wù)器就是通過 Origin 字段的值來進(jìn)行判斷。