Nginx防止cookie丟失的配置


 

一、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 proxy_pass反向代理cookie,session丟失的問題

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

 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不丟失的正確配置是:

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

3)直接代理本地端口

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

二、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的項目,比如:

這種情況下當你用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;
 }   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM