日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx 反向代理及 Cookie 相关问题

發(fā)布時間:2025/3/21 Nginx 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx 反向代理及 Cookie 相关问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近一個項目,遇到了Nginx反向代理和Cookie的問題,遇到的問題很雜,經(jīng)過一周多逐步摸索,總算有個解決方案了,做個記號,主要是記錄下遇到問題的過程,以便出現(xiàn)問題時備查。
【背景】

  • 客戶原有的使用Domino開發(fā)的Web應(yīng)用系統(tǒng),需要部分數(shù)據(jù)通過手機端展示;
  • 原Domino系統(tǒng)只能通過內(nèi)網(wǎng)訪問,沒有域名,內(nèi)網(wǎng)的機器都需要修改hosts來解決域名問題;(至于為什么沒有通過內(nèi)網(wǎng)DNS進行域名解析設(shè)置,還不太清楚,不過這個對項目本身沒有影響)
  • 【問題及解決辦法】

    問題1:手機端需要從外網(wǎng)訪問,沒有域名,沒有越獄或root的手機是不能修改hosts的,且Domino服務(wù)器必須通過域名訪問。

    解決方案:

  • 增加一臺服務(wù)器,安裝Nginx作為反向代理,申請外網(wǎng)IP,并且通過PAT設(shè)置,通過外網(wǎng)訪問到這臺Nginx,Nginx負責(zé)將請求轉(zhuǎn)發(fā)至目標(biāo)服務(wù)器(Domino);
  • 修改反向代理服務(wù)器的hosts,保證這臺機器可以正常通過hosts中的域名訪問Domino;
  • 手機端可以通過IP訪問反向代理即可,無需域名。
  • 問題2:Domino中,鏈接中/符號引發(fā)的問題

    由于Domino的技術(shù)特點,很多鏈接都是需要寫上/的,如:src="/names.nsf?xxx",有的是頁面中這樣寫的,也有的是通過302跳轉(zhuǎn)時自動跳到這個位置,這一點與Java應(yīng)用不同,Java應(yīng)用中更多的是相對位置,不用寫這個/。這個符號導(dǎo)致的問題如下:本來希望通過http://nginx_server/myapp/的方式來訪問,將請求轉(zhuǎn)發(fā)至http://domino_server/,這個需求可以通過在nginx.conf中這樣設(shè)置解決:

    ?

    location /myapp {proxy_pass http://domino_server/; }

    但是由于/的作用,導(dǎo)致直接訪問到了http://nginx_server/,而不再通過/myapp,導(dǎo)致報頁面內(nèi)容找不到。
    解決方案:
    所以還需要在Nginx中,增加對/的反向代理:

    ?

    location / {proxy_pass http://domino_server/; }

    問題3:認證問題

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

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

    解決方案:

    ?

    location / {proxy_cookie_domain domino_server nginx_server; }

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

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

    解決方案:
    在Domino服務(wù)器所在的內(nèi)網(wǎng),增加另一臺Java服務(wù)器,經(jīng)過反向代理的請求,先發(fā)給這臺Java服務(wù)器,由這臺Java服務(wù)器將Request轉(zhuǎn)發(fā)至Domino,收到Domino的Response之后,抽取Cookie,并進行設(shè)置,以保證返回給瀏覽器的Cookie能被保存。
    至此,服務(wù)器部分問題解決。


    補充說明:

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

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

    解決方案:
    發(fā)現(xiàn)Cordova直接打包的應(yīng)用,AppDelegate繼承自原來的CDVAppDelegate,這個類初始化時執(zhí)行了:

    ?

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

    將這部分代碼加入自己應(yīng)用的初始化部分即可。

    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; }

    ?

    總結(jié)

    以上是生活随笔為你收集整理的Nginx 反向代理及 Cookie 相关问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。