HTTP headers 之 host, referer, origin

http headers
還在對 HTTP 頭中的 host, referer, origin 傻傻分不清嗎。今天咱們就來弄清楚他們的區別及用途。

1. host

1.1 定義

Host 請求頭指明瞭請求服務器的域名/IP地址和端口號。html

組成:域名+端口號html5

例子:test.com:1998web

若是沒有給定端口號,會自動使用被請求服務的默認端口(好比請求一個HTTP的URL會自動使用80端口)。跨域

HTTP/1.1 的全部請求報文中必須包含一個 Host 頭字段。若是一個 HTTP/1.1 請求缺乏 Host 頭字段或者設置了超過一個的 Host 頭字段,一個400(Bad Request)狀態碼會被返回。瀏覽器

1.2 用途

咱們知道,不一樣的域名經過 A 記錄或者 CNAME 方式能夠鏈接都同一個 IP 下,同一個 IP 也能夠設置多個不一樣站點,那麼訪問不一樣的域名都轉發到同一 IP ,怎麼區分這些不一樣的站點呢,就是用的 Host 字段。這樣每次訪問都會根據不一樣的 Host 的信息請求到不一樣的站點上面。緩存

簡而言之,就是主要應用在虛擬主機技術上。虛擬主機(virtual hosting)即共享主機(shared web hosting),能夠利用虛擬技術把一臺完整的服務器分紅若干個主機,所以能夠在單一主機上運行多個網站或服務。安全

好比說有一臺 ip 地址爲 11.11.11.11 的服務器,在這臺服務器上部署着淘寶、京東、拼多多的網站,而且配置了三個虛擬主機:a.com, b.com, c.com, 這三個域名都指向 11.11.11.11。 當咱們訪問 c.com 的網站時,看到的是拼多多的頁面而不是淘寶和京東的頁面,緣由就是 Host 請求頭決定着訪問哪一個虛擬主機。服務器

虛擬主機

2. referer

2.1 定義:

Referer 首部包含了當前請求頁面的來源頁面的地址,即表示當前頁面是經過此來源頁面裏的連接進入的。微信

組成:協議+域名+端口號+路徑+參數(注意,不包含 hash值)post

例子:test.com:1998/home

須要注意的是 referer 其實是 "referrer" 誤拼寫。

在如下幾種狀況下,Referer 不會被髮送:

  • 來源頁面採用的協議爲表示本地文件的 "file" 或者 "data" URI;
  • 當前請求頁面採用的是非安全協議,而來源頁面採用的是安全協議(HTTPS);
  • 直接輸入網址或經過瀏覽器書籤訪問;
  • 使用 JavaScript 的 Location.href 或者是 Location.replace();
  • 使用 html5 中 noreferrer

2.2 用途

服務端通常使用 Referer 首部識別訪問來源,可能會以此進行統計分析、日誌記錄以及緩存優化等,還有個常見的用途是圖片防盜鏈。

防盜鏈原理是:當用戶訪問網頁時,referer就是前一個網頁的URL;若是是圖片的話,一般指的就是圖片所在的網頁。當瀏覽器向服務器發送請求時,referer就自動攜帶在HTTP請求頭了。 圖片服務器根據這個請求頭判斷,若是 referer 不是本身的服務器,就將其攔截。

好比說掘金的圖片:

user-gold-cdn.xitu.io/2019/9/23/1…

直接在瀏覽器中打開是能夠訪問的,由於此時 referer 不會被髮送。

而若是把圖片放到本身的網站下,是看不到正常圖片的。

掘金圖片

由於 referer 不在掘金白名單裏。(掘金、微信等客戶端能看到,由於在掘金白名單裏)

那麼如何破解盜鏈呢,經常使用的是用一個服務器程序做爲代理爬蟲,服務器爬蟲能夠自由地設置請求頭。

可是 referrer 存在不少問題。好比說在請求外部網站的時候,攜帶着 url 的不少參數信息,而這些信息其實是隱私的,因此存在必定的隱私暴露風險。 下面的 origin 就不存在這種隱私問題。

3. origin

3.1 定義

請求首部字段 Origin 指示了請求來自於哪一個站點。該字段僅指示服務器名稱,並不包含任何路徑信息。除了不包含路徑信息,該字段與 Referer 首部字段類似。

該首部用於 CORS 請求或者 POST 請求

組成:協議+域名+端口號

注意:只有跨域請求(能夠看到 response 有對應的 header:Access-Control-Allow-Origin),或者同域時發送post請求,纔會攜帶origin請求頭。 若是瀏覽器不能獲取請求源,那麼 origin 知足上面狀況也會攜帶,不過其值爲null。

而referer不論何種狀況下,只要瀏覽器能獲取到請求源都會攜帶。若是瀏覽器若是不能獲取請求源,那麼請求頭中不會攜帶referer。

3.2 用途

用於 CORS: 當咱們的瀏覽器發出跨站請求時,服務器會校驗當前請求是否是來自被容許的站點。服務器就是經過 Origin 字段的值來進行判斷。

參考

相關文章
相關標籤/搜索