簡單記錄一下 Nginx 作為反向代理,以 HTTP 協議向下游客戶端代理基于Spring Security 實現的HTTPS 服務時遇到的問題及解決辦法。
有個基于 Spring Security、Spring MVC 實現的 HTTPS Web 應用,需要通過 Nginx 作為反向代理向外提供服務。
Nginx 和 Web 應用部署在同一臺機器,IP 為 10.115.6.165。Web 應用以 HTTPS 協議監聽在端口 19026。
關于Nginx,因為我們會需要 headers more 模塊中的 more_set_headers 指令。所以,如果是 Windows 環境,推薦在http://nginx-win.ecsds.eu/下載,因為它的nginx編譯進了更多模塊。如果是 Linux 環境,也請確認 headers more 模塊的 more_set_headers 指令可用。
用以下配置運行 Ngnix, 使Nginx用 HTTP 協議在 9080 端口反向代理 19026 上的 HTTPS 服務。
server {
listen 9080;
server_name 10.115.6.165;
location /databoard/ {
proxy_pass https://10.115.6.165:19026/databoard/;
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 REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
但是如果我們用瀏覽器訪問http://10.115.6.165:9080/databoard/login,就會發現如下圖所示的兩個問題:
瀏覽器地址欄上顯示被重定向到了https://10.115.6.165/databoard/dataCmder。這是因為后端Web應用執行了redirect重定向語句,而重定向的協議、地址是基于web應用上下文的,而nginx并沒有做特別的處理就轉發給了瀏覽器,瀏覽器自然不能訪問到這個地址。解決辦法如下:
map $upstream_http_Location $location {
~https://10.115.6.165/(?<param>.*) http://10.115.6.165:9080/$param;
default $upstream_http_Location;
}
server {
... ...
location /databoard/ {
... ...
more_set_headers -s '301 302' 'Location $location';
有 Secure 屬性的 Cookie 意味著如果瀏覽器不是使用 HTTPS 與服務建立鏈接,那么這個 cookie 里的值不會隨請求一起向服務器發送。要解決這個問題就需要在 Nginx 中把 cookie 中的 Secure 屬性去掉再傳給瀏覽器。解決辦法如下:
map $sent_http_set_cookie $resp_cookie {
~*(?<CK_WITHOUT_SECURE>.+)Secure $CK_WITHOUT_SECURE;
}
server {
... ...
location /databoard/ {
... ...
more_set_headers 'Set-Cookie: $resp_cookie';
map $upstream_http_Location $location {
~https://10.115.6.165/(?<param>.*) http://10.115.6.165:9080/$param;
default $upstream_http_Location;
}
map $sent_http_set_cookie $resp_cookie {
~*(?<CK_WITHOUT_SECURE>.+)Secure $CK_WITHOUT_SECURE;
}
server {
listen 9080;
server_name 10.115.6.165;
location /databoard/ {
proxy_pass https://10.115.6.165:19026/databoard/;
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 REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
more_set_headers -s '301 302' 'Location $location';
more_set_headers 'Set-Cookie: $resp_cookie';
}
}
如果 nginx 是以 HTTPS 協議向外提供反向代理,那么無論使用七層代理還是四層代理配置起來都很簡單,如下:
stream {
upstream databoardServer {
hash $remote_addr consistent;
server 10.115.6.165:19026 weight=5;
}
server {
listen 9082;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass databoardServer;
}
}
server {
listen 443 ssl;
server_name 10.115.6.165;
ssl_certificate D:\\tmp\\opensslCrt\\demoAppChain.crt;
ssl_certificate_key D:\\tmp\\opensslCrt\\demoApp.key;
location / {
proxy_pass https://10.115.6.165:19026;
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 Referer https://10.115.6.165;
}
}
當時為了不用在 Nginx 上處理 Cookie ,想通過直接配置 Spring Web 應用不讓 Cookie 帶上 Secure 屬性。于是直接修改配置 application.properties 如下,但是返回給 nginx 的 Cookie 還是帶 Secure 屬性。(類似的還有cookie的HttpOnly也不僅僅是一個配置能決定的)
server.session.cookie.secure=false
通過跟蹤 Spring 源碼發現,只要應用是運行在 HTTPS 協議下的,那么就會讓生成的 Cookie 是 Secure 的。
到此,關于“Nginx作為反向代理并以HTTP協議反向代理HTTPS服務”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注本站網站,小編會繼續努力為大家帶來更多實用的文章!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(資料圖)昨日央行開展4000億元中期借貸便利(MLF)操作和20億元公開市場逆回購操作,中標利率均下降10個基點,分別降至2.75%、2.00%。2022年8月MLF下調LPR利率會跟著降嗎?相關人士表示:8月MLF利率下調,意味著當月LPR報價的定價基礎發生變化,加之近期銀行資金成本也在較快下行,8月LPR報價下降概率大,考慮到近期房貸市場向貸款方傾斜,不排除5年期以上LPR報價下降幅度超過1...
(資料圖)據胡潤研究院今日公布的2022“胡潤百富榜”顯示,農夫山泉和養生堂創始人鐘睒睒以4550億元第二次成為中國首富,其財富比去年增加650億元。這也是二十多年來中國首富財富的最高紀錄。據胡潤官網信息顯示:68歲的鐘睒睒財富比去年增長650億元,即17%,以4,550億元第二次成為中國首富。旗下兩家上市公司萬泰生物和農夫山泉股價表現穩定,業績增長表現突出。萬泰生物今年上...
什么是支付手段?支付手段是指貨幣用于清償債務、支付賦稅、租金、工資等的職能。這一職能是為適應商品生產和商品交換發展的需要而發展起來的。由于商品生產和商品交換在時空上的差異,就產生了商品使用價值的讓渡與商品價值的實現在時間上分離開來的客觀必然性。某些商品消費者在需要購買時沒有貨幣,只有到將來某一時間才有支付能力,同時,某些商品生產者又急需出售其商品,于是就產生了賒購賒銷。支付手段是指在交易過程中交易...