Nginx作反向代理的時候,咱們通常習慣添加proxy_cookie_domain配置,來作cookie的域名轉換,好比前端
... location /api { proxy_pass https://b.test.com; proxy_cookie_domain b.test.com a.test.com; } ...
在以前的博客中我也是這麼寫的,可是最近在項目中發現,不配置這個屬性,依然運轉正常,背後冷風陣陣,我發現本身一直以來可能又理解錯了這個選項,而後還在這給別人講。。。nginx
咱們首先來看下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.api
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的項目,好比
這種狀況下當你用nginx作反向代理的時候,就必需要轉換一下了。app
說到這裏,咱們再看看以前的錯誤理解: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的做用所在。
當response的set-cookie中domain不去設置時,cookie順利傳入瀏覽器中,瀏覽器會自動設置這個cookie的生效域名爲當前域名。
和這個相似的還有proxy_cookie_path屬性,一樣的該屬性僅做用在修改response set-cookie的path屬性,而通常狀況下,用的也比較少。
不少問題,有時候都是太過理所固然的覺得它是怎麼樣的,而且生效了、達到目的了,咱們就認爲它是這樣的了,但每每打臉就會在後面不期而至。多學習,多去關注一些底層的原理,纔會發現本身理解的錯誤,望諸君共勉~ 若是錯誤,歡迎指出~