zoukankan      html  css  js  c++  java
  • nginx下redirect问题

     情况说明
    nginx配置https,tomcat正常http接受nginx转发。
    nginx 代理https后,(java代码redirect地址)应用redirect https变成http

    原因分析:

    经过nginx代理后用的spring mvc的redirect,

    其中: request.getScheme() return http but not https.

    浏览器调整的地址变成http

    解决办法:http://han.guokai.blog.163.com/blog/static/136718271201211631456811/

    在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )?
    在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:

        request.getScheme()  //总是 http,而不是实际的http或https
        request.isSecure()  //总是false(因为总是http)
        request.getRemoteAddr()  //总是 nginx 请求的 IP,而不是用户的IP
        request.getRequestURL()  //总是 nginx 请求的URL 而不是用户实际请求的 URL
        response.sendRedirect( 相对url )  //总是重定向到 http 上 (因为认为当前是 http 请求)

    如果程序中把这些当实际用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
    配置 Nginx 的转发选项:

    proxy_set_header       Host $host;#设置此项会导致redirect有问题
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
    配置Tomcat server.xml 的 Engine 模块下配置一个 Value:
    <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

    配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。X-Forwarded-For 是为了获得实际用户的 IP。




  • 相关阅读:
    模板方法模式
    策略模式
    享元模式
    组合模式
    桥接模式
    外观模式
    代理模式
    装饰者模式
    适配器模式
    类之间的关联关系和依赖关系
  • 原文地址:https://www.cnblogs.com/growingpains/p/7373058.html
Copyright © 2011-2022 走看看