nginx反向代理后無限重定向的問題解決方法
先說說奇葩的需求:https轉(zhuǎn)其他網(wǎng)站的http
在項(xiàng)目里用iframe內(nèi)嵌其他網(wǎng)站,這個(gè)“其他網(wǎng)站”不是我們開發(fā)的,并且是http,
但瀏覽器會(huì)默認(rèn)阻止從https網(wǎng)站向http地址發(fā)起請(qǐng)求
因此初步的解決方案是:用我們自己的服務(wù)器nginx轉(zhuǎn)發(fā)一次,雖然服務(wù)器到“其他網(wǎng)站”的傳輸還是明文,但至少可以做到甩鍋(至少用戶到我們的服務(wù)器的傳輸是SSL......)
然后這個(gè)“其他網(wǎng)站”就出現(xiàn)了無限重定向問題。
另外,根據(jù)以往的經(jīng)歷,在給WordPress加https的時(shí)候,也可能會(huì)遇到無限重定向的問題。
原因
本質(zhì)上是因?yàn)椋?ldquo;其他網(wǎng)站”的服務(wù)程序具有請(qǐng)求頭校驗(yàn)。
通常來說,nginx轉(zhuǎn)發(fā)的請(qǐng)求,是帶有原始請(qǐng)求頭信息的請(qǐng)求。
比如:
nginx服務(wù)器的地址是https://server1.domin:1111
生產(chǎn)服務(wù)器的地址是http://server2.domin:2222
瀏覽器向https://server1.domin:1111發(fā)起請(qǐng)求
此時(shí),雖然nginx把請(qǐng)求代理到了http://server2.domin:2222但由于一系列的參數(shù)設(shè)置,http請(qǐng)求頭中的信息還是https://server1.domin:1111
這種情況下,如果“其他網(wǎng)站”的服務(wù)程序(Apache或nginx)中加入了請(qǐng)求頭校驗(yàn),也就是說,如果端口不是2222,就重定向;
如果地址不是server2.domin,就重定向。
而我們的nginx已經(jīng)把請(qǐng)求頭改成了原始信息,自然不能通過他們的驗(yàn)證,所以就會(huì)被強(qiáng)制重定向了。
如圖,它把我的38004端口的請(qǐng)求重定向到了默認(rèn)的443,說明對(duì)方服務(wù)器有地址校驗(yàn),而且重定向只改變了端口。
而如果我的nginx恰好也用的443,就會(huì)無限重定向了。
解決
我們先來看看通常使用的nginx的重寫參數(shù):
server { listen 38002 ssl; server_name server1.domin; ssl_certificate server1.domin.cer; ssl_certificate_key server1.domin.key; location / { proxy_set_header Host $host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr:$remote_port; proxy_pass http://server2.domin:2222/; } }
這種情況下,就是直接在代理的請(qǐng)求中,加入原始請(qǐng)求頭信息
那么我們?cè)趺锤哪兀?/p>
我們要讓對(duì)方服務(wù)器認(rèn)為,nginx發(fā)過去的請(qǐng)求不是代理過去的,而是直接發(fā)過去的。
再換種方式說,此時(shí)nginx的作用不再是反向代理,而是正向代理,目的是隱藏真正的請(qǐng)求信息,讓對(duì)方服
務(wù)器認(rèn)為就是nginx直接請(qǐng)求的對(duì)方服務(wù)器。
所以我們要把ip、端口等等參數(shù)直接寫死。
server { listen 443 ssl; server_name server1.domin; ssl_certificate server1.domin.cer; ssl_certificate_key server1.domin.key; location / { proxy_set_header Host server2.domin; // 對(duì)方服務(wù)器的域名 proxy_set_header X-Real-IP 123.123.123.123; // 對(duì)方服務(wù)器的真實(shí)地址,從控制臺(tái)中找到 proxy_set_header X-Forwarded-For $123.123.123.123:80; proxy_set_header X-Forwarded-Host server2.domin; // 對(duì)方服務(wù)器的域名 proxy_set_header X-Forwarded-Port 80; // 對(duì)方服務(wù)器的端口 proxy_pass http://server2.domin:2222/; } }
于是代理過程就變成了這樣:
總結(jié)
在我們不得不用nginx代理,并且無法讓對(duì)方配合的情況下
只要把http中的請(qǐng)求頭信息替換為對(duì)方網(wǎng)站的請(qǐng)求頭信息(而不是使用原始信息)
就可以通過對(duì)方服務(wù)器的host驗(yàn)證了。
時(shí)間倉促,有些地方可能說的不準(zhǔn),但目前能用,如有錯(cuò)誤歡迎指正。
以上就是nginx反向代理后無限重定向的問題解決方法的詳細(xì)內(nèi)容,更多關(guān)于nginx反向代理重定向的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- nginx 老網(wǎng)站域名重定向到新網(wǎng)站的方法(親測(cè))
- 在Nginx中實(shí)現(xiàn)URL重寫與重定向
- Nginx地址重定向的實(shí)現(xiàn)
- nginx的服務(wù)配置及重定向問題
- nginx重寫和重定向關(guān)系與配置方式
- nginx重定向解決(rewrite or internal redirection cycle)
- Nginx重定向后請(qǐng)求參數(shù)丟失的原因分析及解決方案
- Nginx中rewrite(地址重定向)的深入剖析
- 利用Nginx實(shí)現(xiàn)URL重定向的簡(jiǎn)單方法
- 配置nginx 重定向到系統(tǒng)維護(hù)頁面
- nginx中重定向的實(shí)現(xiàn)
相關(guān)文章
通過nginx反向代理來調(diào)試代碼的實(shí)現(xiàn)
這篇文章主要介紹了通過nginx反向代理來調(diào)試代碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01nginx使用nginx-rtmp-module模塊實(shí)現(xiàn)直播間功能
做的過程出現(xiàn)很多問題,環(huán)境其實(shí)就需要nginx就可以,然后就是在播放的問題,m3u8的格式,mac直接訪問就支持,蘋果系統(tǒng)原生H5支持m3u8,還有就是手機(jī)直接訪問也支持!但是其他其他系統(tǒng)PC端不支持,嘗試了好多都不行,最后終于找到了一個(gè)支持m3u8格式H5播放2017-10-10Nginx中運(yùn)行PHP框架Laravel的配置文件分享
這篇文章主要介紹了Nginx中運(yùn)行PHP框架Laravel的配置文件分享,本文直接給出配置示例,需要的朋友可以參考下2015-06-06Nginx Rewrite模塊應(yīng)用的幾種場(chǎng)景
這篇文章主要介紹了Nginx Rewrite模塊應(yīng)用的幾種場(chǎng)景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Nginx 安裝筆記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡)
Nginx安裝簡(jiǎn)記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡) Nginx,據(jù)說高性能和穩(wěn)定性比Apache還牛,并發(fā)連接處理能力強(qiáng),低系統(tǒng)資源消耗。目前已有250多萬web站點(diǎn)在使用2009-10-10Nginx設(shè)置目錄的訪問權(quán)限實(shí)現(xiàn)訪問靜態(tài)資源
遇到Permission denied錯(cuò)誤,通常是Nginx用戶權(quán)限不足,本文就來介紹一下Nginx設(shè)置目錄的訪問權(quán)限實(shí)現(xiàn)訪問靜態(tài)資源2024-10-10