最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nginx反向代理https內(nèi)部定向到http報(bào)302的問題及解決

 更新時(shí)間:2023年12月22日 15:19:59   作者:shihuc  
這篇文章主要介紹了nginx反向代理https內(nèi)部定向到http報(bào)302的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

環(huán)境信息

Linux:Linux i-8emt1zr1 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

nginx:nginx version: openresty/1.9.3.2

Tomcat:Server version: Apache Tomcat/7.0.64

1. 問題描述

我們開發(fā)的客服系統(tǒng),因?yàn)橄⒌牡絹?,有的谷歌瀏覽器(V62)不支持http的消息提醒,要求https,故而,我們的系統(tǒng),要將系統(tǒng)改造成https模式,另外,我們的系統(tǒng),也有必要轉(zhuǎn)化為https,為后續(xù)推廣做準(zhǔn)備。

2. 系統(tǒng)架構(gòu)

LB+nginx+tomcat集群

3. 當(dāng)前配置情況

SSL證書配置在LB上,nginx和tomcat服務(wù)器上,任然采用http協(xié)議通訊。

即LB在接收到客戶瀏覽器https請(qǐng)求消息后,將轉(zhuǎn)發(fā)給LB下掛載的nginx上,都是以http的方式轉(zhuǎn)發(fā),nginx對(duì)這些請(qǐng)求進(jìn)行反向代理,代理到后面的tomcat服務(wù)器上。

4. 遇到的問題

客服系統(tǒng),有權(quán)限控制,基于tomcat的web應(yīng)用,用戶登錄后,執(zhí)行redirect跳轉(zhuǎn)到指定的服務(wù)頁面。

就是這個(gè)跳轉(zhuǎn),遇到了問題,redirect在這里都被當(dāng)做http跳轉(zhuǎn)了。

登錄前的樣子:

登錄后的樣子:

問題主要發(fā)生在Tomcat7上,驗(yàn)證過tomcat8,是不存在問題的。

5. 如何解決

針對(duì)Tomcat7的這個(gè)問題,思路很簡(jiǎn)單,重點(diǎn)是解決redirect的時(shí)候,通知客戶端瀏覽器以正確的scheme(https還是http)進(jìn)行再次發(fā)起請(qǐng)求。

問題是, nginx這個(gè)時(shí)候收到的請(qǐng)求是來自LB的http請(qǐng)求了,怎么弄?其實(shí)是有辦法的,可以利用HttpRequest中的referer字段,這個(gè)字段的含義,自行科普吧。

將referer的請(qǐng)求scheme信息,用來作為當(dāng)前請(qǐng)求的scheme,如此可以保證所有的請(qǐng)求都是同一個(gè)scheme,不會(huì)因?yàn)閞edirect而遺漏信息。

nginx里面相應(yīng)的配置如下:

location /CSS/websocket {
            proxy_pass http://css_ws_svr;
            proxy_set_header Host $host;
            proxy_set_header Remote_Addr $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        location /CSS {
            proxy_pass http://css_svr;
            proxy_set_header Host $host;
            proxy_set_header Remote_Addr $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            set $mscheme $scheme;
            if ($http_referer ~* ^https.*) {
                set $mscheme "https";
            }
            proxy_set_header X-Forwarded-Proto $mscheme;
        }

如上配置,經(jīng)過nginx反向代理后的HttpServletRequest中header部分就帶上了字段X-Forwarded-Proto。

另外一方面,就是tomcat里面,要做一個(gè)配置,讓tomcat在解析請(qǐng)求和做重定向的時(shí)候,知道用什么協(xié)議。

主要的配置在server.xml里面的Engine下,定義一個(gè)Value元素。

具體配置如下:

<Engine name="Catalina" defaultHost="localhost">

      
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

        <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

        <Context path="/CSS" docBase="/home/tomcat/app/cssv2"/>
      </Host>
    </Engine>

這個(gè)配置里面,重點(diǎn)是protocolHeader字段,意思就是說,當(dāng)protocolHeader字段的值為protocolHeaderHttpsValue的https的時(shí)候,認(rèn)為是安全連接,否則就是http的非安全連接。

對(duì)應(yīng)的代碼邏輯,可以看org.apache.catalina.valves.RemoteIpValve這個(gè)類的源碼

public void invoke(org.apache.catalina.connector.Request request, Response response)
 throws IOException, ServletException
{
......
if (protocolHeader != null) {
    String protocolHeaderValue = request.getHeader(protocolHeader);
    if (protocolHeaderValue != null)
    {

        if (protocolHeaderHttpsValue.equalsIgnoreCase(protocolHeaderValue)) {
            request.setSecure(true);
            
            request.getCoyoteRequest().scheme().setString("https");
        
            setPorts(request, httpsServerPort);
        } else {
            request.setSecure(false);
                
            request.getCoyoteRequest().scheme().setString("http");
                
            setPorts(request, httpServerPort);
        }
    }
}
......
}

經(jīng)過上面的分析和配置修改,最終很靈活的實(shí)現(xiàn)https和http同時(shí)工作。

搞定這個(gè)問題,重點(diǎn)還是要對(duì)Http協(xié)議工作的流程有所了解,才能很容易的找到解決問題的思路。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • nginx中重定向的實(shí)現(xiàn)

    nginx中重定向的實(shí)現(xiàn)

    本文主要介紹了Nginx中l(wèi)ocation匹配和rewrite重定向的規(guī)則與應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Nginx access.log日志詳解及統(tǒng)計(jì)分析小結(jié)

    Nginx access.log日志詳解及統(tǒng)計(jì)分析小結(jié)

    nginx有一個(gè)非常靈活的日志記錄模式,本文主要介紹了Nginx access.log日志詳解及統(tǒng)計(jì)分析小結(jié),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Nginx配置并開啟WebDAV服務(wù)的完整指南

    Nginx配置并開啟WebDAV服務(wù)的完整指南

    本文主要介紹了Nginx上配置并開啟WebDAV服務(wù)的完整指南,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 在Ubuntu20.04上安裝Kubernetes集群

    在Ubuntu20.04上安裝Kubernetes集群

    容器化為開發(fā)人員提供了很大的靈活性,最常用的容器化應(yīng)用程序之一是 Docker,在容器上部署服務(wù)的主要原因之一是它們靈活、輕量級(jí)并且在部署在數(shù)百臺(tái)機(jī)器上時(shí)易于擴(kuò)展,但是,誰來管理所有這些容器?這就是 Kubernetes 發(fā)揮作用的地方
    2023-12-12
  • Nginx訪問日志access_log配置及信息詳解(推薦)

    Nginx訪問日志access_log配置及信息詳解(推薦)

    當(dāng)你設(shè)置日志級(jí)別成debug,如果你在調(diào)試一個(gè)在線的高流量網(wǎng)站的話,你的錯(cuò)誤日志可能會(huì)記錄每個(gè)請(qǐng)求的很多消息,這樣會(huì)變得毫無意義,下面小編給大家介紹Nginx訪問日志access_log配置及信息詳解,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Nginx+Lua腳本+Redis 實(shí)現(xiàn)自動(dòng)封禁訪問頻率過高IP

    Nginx+Lua腳本+Redis 實(shí)現(xiàn)自動(dòng)封禁訪問頻率過高IP

    本文主要介紹了如何使用OpenResty+Lua進(jìn)行動(dòng)態(tài)封禁IP的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 一文帶你搞懂Nginx中的配置文件

    一文帶你搞懂Nginx中的配置文件

    Nginx(發(fā)音為“engine-x”)是一款高性能的?Web?服務(wù)器、反向代理服務(wù)器和負(fù)載均衡器,廣泛應(yīng)用于全球各類網(wǎng)站和應(yīng)用中,下面就跟隨小編一起來了解下如何配置?Nginx?以滿足不同的需求吧
    2025-01-01
  • Nginx反向代理解決跨域詳細(xì)代碼示例

    Nginx反向代理解決跨域詳細(xì)代碼示例

    Nginx作為反向代理服務(wù)器,能夠在前端輕松解決跨域問題,無需后端配合,這篇文章主要介紹了Nginx反向代理解決跨域的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-06-06
  • Kubernetes中Nginx服務(wù)啟動(dòng)失敗排查流程分析(Error:?ImagePullBackOff)

    Kubernetes中Nginx服務(wù)啟動(dòng)失敗排查流程分析(Error:?ImagePullBackOff)

    這篇文章主要介紹了Kubernetes中Nginx服務(wù)啟動(dòng)失敗排查流程(Error:?ImagePullBackOff),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • Nginx搭建支持WebDAV協(xié)議的私有云存儲(chǔ)網(wǎng)關(guān)的實(shí)現(xiàn)步驟

    Nginx搭建支持WebDAV協(xié)議的私有云存儲(chǔ)網(wǎng)關(guān)的實(shí)現(xiàn)步驟

    本文主要介紹了Nginx搭建支持WebDAV協(xié)議的私有云存儲(chǔ)網(wǎng)關(guān)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04

最新評(píng)論

尚义县| 广灵县| 山西省| 广德县| 涡阳县| 莒南县| 浦县| 邹平县| 农安县| 宁陵县| 济宁市| 浪卡子县| 龙游县| 米脂县| 陆丰市| 阿尔山市| 虎林市| 策勒县| 临颍县| 沽源县| 日照市| 海阳市| 罗田县| 达拉特旗| 宜宾市| 太仆寺旗| 光泽县| 西华县| 嘉祥县| 永济市| 渑池县| 颍上县| 隆回县| 丰原市| 柯坪县| 宁南县| 新郑市| 许昌市| 聊城市| 绿春县| 胶南市|