web 部署專題(八):Nginx 反向代理中cookie相關問題


問題3:認證問題

Domino服務器中,通過寫了一些接口代碼,提供RESTful的服務,來對手機端進行提供服務。但是由於原來的環境,沒有SSO,而且不通過認證,沒法訪問到Domino里面的接口代碼。
解決方案:
手機端通過HTTP,模擬登錄過程

問題4:“問題3”的解決方案,由於經過了反向代理,導致Domino的Response中Cookie的Domain屬性,與反向代理的域名不一致,Cookie的Domain屬性,仍然是Domino服務器的域名。手機端拿到Cookie之后,再次進行請求的話,請求是發往反向代理的,瀏覽器認為之前拿到的Cookie不屬於反向代理,所以Request的時候,不會把Cookie帶上,導致認證不能通過。

解決方案:

location / {
    proxy_cookie_domain domino_server nginx_server;
}

在Nginx上這樣設置后,可以讓反向代理修改Cookie的Domain屬性。

問題5:“問題4”的解決方案,適合反向代理服務器有域名的情況,對於沒有域名的情況,雖然瀏覽器收到的Response中有正確的Cookie信息(從Chrom開發工具的Network頁簽查看,包括域名也已經經過轉換成反向代理的域名),但是瀏覽器卻沒能正常保存這個Cookie(從Chrom開發工具的Application頁簽查看Cookie)。這一點比較奇怪,Java寫的程序,通過反向代理后,不論反向代理是IP還是域名,瀏覽器端都可以正常拿到Cookie並保存,具體原因還沒搞清。不知是否Domino服務器是否有什么特別的安全設置。

解決方案:
在Domino服務器所在的內網,增加另一台Java服務器,經過反向代理的請求,先發給這台Java服務器,由這台Java服務器將Request轉發至Domino,收到Domino的Response之后,抽取Cookie,並進行設置,以保證返回給瀏覽器的Cookie能被保存。
至此,服務器部分問題解決。


補充說明:

“問題5”中,開始的解決方案,是Java服務器將拿到的Cookie通過Response的Body返回,由頁面JS將Cookie寫入。但是這種方案,當頁面位於服務端時有效(跨域一樣有效),但是對於通過Electron打包的本地頁面,JS無法將Cookie正常寫入,這一點也暫時原因不明,不知道是否是由於瀏覽器認為本地頁面寫的Cookie與服務端跨域?對於本地頁面,還是需要服務端在Response中正常返回Cookie。

問題6:iOS版集成Cordova后,通過本地頁面訪問服務器,收到的Cookie不能正常保存,但是直接使用Cordova打包是可以的。

解決方案:
發現Cordova直接打包的應用,AppDelegate繼承自原來的CDVAppDelegate,這個類初始化時執行了:

    NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; int cacheSizeMemory = 8 * 1024 * 1024; // 8MB int cacheSizeDisk = 32 * 1024 * 1024; // 32MB NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"]; [NSURLCache setSharedURLCache:sharedCache]; 

將這部分代碼加入自己應用的初始化部分即可。

nginx.conf 完整配置
location /myapp { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie; proxy_pass http://domino.server/; proxy_cookie_domain domino.server nginx.server; proxy_redirect off; }
作者:舌尖上的大胖
鏈接:https://www.jianshu.com/p/aeed2a56a3eb
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

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



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