Nginx反向代理理解誤區之proxy_cookie_domain
小心這個人,他又在文末發招人廣告了!
基本內容
Nginx做反向代理的時候,我們一般習慣新增proxy_cookie_domain配置,來做cookie的域名轉換,比如
...
location /api {
proxy_pass https://b.test.com;
proxy_cookie_domain b.test.com a.test.com;
}
...
複製程式碼
在之前的部落格中我也是這麼寫的,但是在專案中發現,不配置這個屬性,依然運轉正常,背後冷風陣陣,我發現自己一直以來可能又理解錯了這個選項,然後還在這給別人講。。。
我們首先來看下proxy_cookie_domain的官方定義,
Syntax: proxy_cookie_domain off; proxy_cookie_domain domain replacement; Default: proxy_cookie_domain off; Context: http,server,location This directive appeared in version 1.1.15.
Sets a text that should be changed in the domain attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “domain=localhost”. The directive proxy_cookie_domain localhost example.org will rewrite this attribute to “domain=example.org”.
翻譯過來就是proxy_cookie_domain引數的作用是轉換response的set-cookie header中的domain選項,由後端設定的域名domain轉換成你的域名replacement,來保證cookie的順利傳遞並寫入到當前頁面中,注意proxy_cookie_domain負責的只是處理response set-cookie頭中的domain屬性,僅此而已。
但是我們知道response在寫set-cookie的時候,domain是一個可選項,並不是必填項,所以經常能看到如下這種情況
這個時候由於set-cookie本身就沒有domain內容,proxy_cookie_domain也就不沒有必要了,這也是為什麼在部分專案中不配置proxy_cookie_domain依然正常的原因。但是對於一些設定了domain的專案,比如
誤區回溯
說到這裡,我們再看看之前的錯誤理解:
“proxy_cookie_domain的作用是實現前後端cookie域名轉換,保證順利傳遞”
乍一看好像也沒錯,但是現在想想,理解還是不夠啊,因為proxy_cookie_domain的作用是單向的,並不是雙向轉換的。我們先看下cookie的傳遞過程,盜一張圖先(懶得畫了。。。)
瀏覽器在傳送請求的時候,會在request header中帶上cookie項(有內容的話),此時的cookie是一個字串,一個key=value並用分號分割的字串,
其中並不包含任何域名資訊。這是因為瀏覽器在設定cookie選項的時候,所選取的內容都是快取中介面域名下的。然後request的只要請求傳送出去之後,cookie中有關domain資訊其實是不存在的,它只是一個普通的字串,隨便proxy_pass到任何位置,都會正常攜帶下去。因此在前端到後端的request的過程中,proxy_cookie_domain是沒用的
而server端在做響應的時候,通過set-cookie的domain屬性,可以控制cookie的生效域名目標,做到諸如二級域名cookie分離等等,如果前端接收到的set-cookie的domain和當前域名不一致,或者一級域名不一致(二級域名可以共享一級域名下的cookie),這個cookie在後續的通訊中就是無效的,所以這裡才需要去做domain的轉換,也就是說response中set-cookie的domain轉換才是有意義的,這也正是proxy_cookie_domain的作用所在。 當reseponse的set-cookie中domain不去設定時,cookie順利傳入瀏覽器中,瀏覽器會自動設定這個cookie的生效域名為當前域名。
和這個類似的還有proxy_cookie_path屬性,同樣的該屬性僅作用在修改response set-cookie的path屬性,而一般情況下,用的也比較少。
嘮叨兩句
很多問題,有時候都是太過理所當然的以為它是怎麼樣的,並且生效了、達到目的了,我們就認為它是這樣的了,但往往打臉就會在後面不期而至。多學習,多去關注一些底層的原理,才會發現自己理解的錯誤,望諸君共勉~
我擦 這個人又來發廣告啦!!:emmm最近我們又要招人了,螞蟻金服-芝麻信用招前端P6/7,共5個名額,5個呢!5個!機會難得!加油啊!你可以的!,大廠你懂的,獎金分你一半啊,感興趣的快來試試吧,有興趣微信聊聊的加我哈heiohiio,簡歷直接丟我郵箱也可以啊~[email protected]
如果錯誤,歡迎指出~