欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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è)問題,思路很簡單,重點(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學(xué)習(xí)總結(jié)五(nginx反向代理)

    nginx學(xué)習(xí)總結(jié)五(nginx反向代理)

    Nginx代理與負(fù)載均衡配置與優(yōu)化技巧,方便需要的朋友
    2012-11-11
  • 前端項(xiàng)目中Nginx配置指南詳解

    前端項(xiàng)目中Nginx配置指南詳解

    這篇文章主要為大家詳細(xì)介紹了在前端項(xiàng)目開發(fā)中如何配置Nginx,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-09-09
  • linux下Nginx+Tomcat負(fù)載均衡配置方法

    linux下Nginx+Tomcat負(fù)載均衡配置方法

    這篇文章主要介紹了linux下Nginx+Tomcat負(fù)載均衡配置方法,需要的朋友可以參考下
    2016-09-09
  • 詳解Nginx反向代理WebSocket響應(yīng)403的解決辦法

    詳解Nginx反向代理WebSocket響應(yīng)403的解決辦法

    本篇文章主要介紹了詳解Nginx反向代理WebSocket響應(yīng)403的解決辦法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 基于Nginx+lua實(shí)現(xiàn)簡單的XSS攻擊攔截

    基于Nginx+lua實(shí)現(xiàn)簡單的XSS攻擊攔截

    WAF即web應(yīng)用防火墻,Nginx是一個(gè)主流的代理服務(wù),除了本身的Nginx日志,作為用戶肯定也支持對(duì)請(qǐng)求信息進(jìn)行操作,?很多都是通過在代理服務(wù)器上掛載規(guī)則特征,實(shí)現(xiàn)軟件層面的軟WAF進(jìn)行WEB防護(hù),本文主要給大家介紹了Nginx+Lua實(shí)現(xiàn)一個(gè)簡單的XSS攻擊攔截,需要的朋友可以參考下
    2024-01-01
  • 使用nginx.exe時(shí)閃退的原因和解決方法

    使用nginx.exe時(shí)閃退的原因和解決方法

    最近使用老師給的nginx.exe時(shí),點(diǎn)擊nginx.exe突然屏幕就閃一下,經(jīng)過一番排查,發(fā)現(xiàn)是端口被占用所導(dǎo)致的,所以本文就給大家講講端口被占用時(shí)的解決方法詳細(xì)步驟,需要的朋友可以參考下
    2023-07-07
  • Nginx之rewrite實(shí)現(xiàn)URL重寫方式

    Nginx之rewrite實(shí)現(xiàn)URL重寫方式

    文章介紹了Nginx的rewrite模塊,包括其重要性、相關(guān)指令(如set、if、break、return、rewrite)的使用方法和作用域,并舉例說明了這些指令的實(shí)際應(yīng)用場景,如域名重定向和防盜鏈處理
    2025-03-03
  • 如何用Nginx解決前端跨域問題

    如何用Nginx解決前端跨域問題

    在開發(fā)靜態(tài)頁面時(shí),類似Vue的應(yīng)用,我們常會(huì)調(diào)用一些接口,這些接口極可能是跨域,這篇文章主要介紹了如何用Nginx解決前端跨域問題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01
  • Windows Server 2016 MySQL數(shù)據(jù)庫安裝配置詳細(xì)安裝教程

    Windows Server 2016 MySQL數(shù)據(jù)庫安裝配置詳細(xì)安裝教程

    這篇文章主要介紹了Windows Server 2016 MySQL數(shù)據(jù)庫安裝配置詳細(xì)安裝教程,需要的朋友可以參考下
    2017-08-08
  • nginx代理后端路徑獲取IP為127.0.0.1問題

    nginx代理后端路徑獲取IP為127.0.0.1問題

    文章討論了在使用Nginx作為反向代理時(shí),如何正確配置以避免在前端路徑A/api訪問后端時(shí)丟失真實(shí)的IP地址,通過有效的Nginx配置,可以確保在前后端分離的場景中,客戶端通過前端路徑訪問后端時(shí),后端能夠正確獲取客戶端的真實(shí)IP地址,示例配置展示了如何實(shí)現(xiàn)這一目標(biāo)
    2025-02-02

最新評(píng)論