Nginx防止cookie丟失的配置

 

1、proxy_cookie_path 參數的做用是用來改變cookie的路徑
語法: proxy_cookie_path path replacement;
path就是你要替換的路徑 replacement 就是要替換的值前端

爲何cookie 會丟失?
好比說一個沒有通過代理的地址 : http://127.0.0.1/project       cookie_path:/project
若是按照第二種方式代理那麼地址就是 : http://127.0.0.1/proxy_path       cookie_path: /proxy_path
若是cookie_path與地址欄上的path不相符遊覽器就不會接受這個cookie,天然session就失效了。nginx

解決nginx proxy_pass反向代理cookie,session丟失的問題後端

下面是可能的三種狀況
1)host、端口轉換,cookie不會丟失api

 location /project {
        proxy_pass   http://127.0.0.1:8080/project;
    }

經過瀏覽器訪問http://127.0.0.1/project時,瀏覽器的cookie內有jsessionid。再次訪問時,瀏覽器會發送當前的cookie。瀏覽器

2)若是路徑也變化了,則須要設置cookie的路徑轉換,nginx.conf的配置以下緩存

location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/project;
    }

經過瀏覽器訪問http://127.0.0.1/proxy_path時,瀏覽器的cookie內沒有jsessionid。再次訪問時,後臺固然沒法獲取到cookie了。
加上路徑轉換:proxy_cookie_path  /project /proxy_path;則能夠將project的cookie輸出到proxy_path上。
保證cookie不丟失的正確配置是:bash

 location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/project;
        proxy_cookie_path  /project /proxy_path;
    }

3)直接代理本地端口cookie

    location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/;
        proxy_cookie_path  /project /proxy_path; # project 爲你的項目名 也可用變量代替
    }

2、proxy_cookie_domain 參數的做用是轉換response的set-cookie header中的domain選項,由後端設置的域名domain轉換成你的域名replacement,來保證cookie的順利傳遞並寫入到當前頁面中,注意proxy_cookie_domain負責的只是處理response set-cookie頭中的domain屬性,僅此而已!session

在瞭解了這個參數後,發現不配置這個屬性,依然運轉正常!dom

response在寫set-cookie的時候,domain是一個可選項,並非必填項,因此常常能看到以下這種狀況:

這個時候因爲set-cookie自己就沒有domain內容,proxy_cookie_domain也就不沒有必要了,這也是爲何在部分項目中不配置proxy_cookie_domain依然正常的緣由。可是對於一些設置了domain的項目,好比:

這種狀況下當你用nginx作反向代理的時候,就必需要轉換一下了。

=====================  Nginx反向代理理解誤區之proxy_cookie_domain  ======================
以前錯誤地理解proxy_cookie_domain的做用是實現先後端cookie域名轉換,保證順利傳遞!好比說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錯誤理解致使地!!乍一看好像也沒錯,可是如今想一想,理解仍是不夠啊,由於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屬性,而通常狀況下,用的也比較少。

下面是Nginx裏關於proxy_cookie_domain的一個配置:

頁面地址是a.com,可是要用b.com的cookie須要

proxy_set_header Cookie $http_cookie;
location / {
proxy_cookie_domain b.com a.com;            #注意別寫錯位置了 proxy_cookie_path / /;
proxy_pass http://b.com;
 }   
相關文章
相關標籤/搜索