當心這我的,他又在文末發招人廣告了!前端
Nginx作反向代理的時候,咱們通常習慣添加proxy_cookie_domain配置,來作cookie的域名轉換,好比nginx
...
location /api {
proxy_pass https://b.test.com;
proxy_cookie_domain b.test.com a.test.com;
}
...
複製代碼
在以前的博客中我也是這麼寫的,可是在項目中發現,不配置這個屬性,依然運轉正常,背後冷風陣陣,我發現本身一直以來可能又理解錯了這個選項,而後還在這給別人講。。。後端
咱們首先來看下proxy_cookie_domain的官方定義,api
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是一個可選項,並非必填項,因此常常能看到以下這種狀況cookie
這個時候因爲set-cookie自己就沒有domain內容,proxy_cookie_domain也就不沒有必要了,這也是爲何在部分項目中不配置proxy_cookie_domain依然正常的緣由。可是對於一些設置了domain的項目,好比app
這種狀況下當你用nginx作反向代理的時候,就必需要轉換一下了。說到這裏,咱們再看看以前的錯誤理解:dom
「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,簡歷直接丟我郵箱也能夠啊~heioray@sina.com
若是錯誤,歡迎指出~