【问题标题】:NginX SSL Offload $scheme has no effectNginX SSL Offload $scheme 没有效果
【发布时间】:2013-03-12 14:12:29
【问题描述】:

我正在尝试使用 Nginx 和 Tomcat 进行 ssh 卸载。我的设置是: 浏览器 -(HTTPS)-> nginx -> (http/https) -> tomcat

我已经设置 nginx 在 x-forwarded-proto 标头中转发请求方案。

                    proxy_pass http://default_upstream;
                    add_header Set-Cookie "SRVGROUP=$group; path=/";
                    proxy_next_upstream error;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Host $http_host;
                    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
                    proxy_set_header X-URI $uri;
                    proxy_set_header X-ARGS $args;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header Refer $http_refer;
                    proxy_redirect http:// $scheme://;
                    proxy_set_header Strict-Transport-Security "max-age=7200";

在 tomcat 上,我打印 X-Forwarded-Proto 标头,我总是得到 http。 如果我替换

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-Proto https;

一切正常。但我想使用 $scheme,因为并非我的所有页面都通过 https 提供。

正在寻找解决方案,或者是否有人以前遇到过同样的问题。

【问题讨论】:

    标签: tomcat nginx


    【解决方案1】:

    请尝试:

    方法1:

    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    

    方法2:

    nginx.conf
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    
    server.xml:
    
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
           remoteIpHeader="x-forwarded-for"
           remoteIpProxiesHeader="x-forwarded-by"
           protocolHeader="X-Forwarded-Proto"
           httpsServerPort="443"
        />
    

    如果还是有问题,建议你tcpdump nginx和tomcat之间的数据

    【讨论】:

      【解决方案2】:

      我找到了。在我的 ssl nginx 配置中,有人留下了这个:

      proxy_pass http://127.0.0.1;
      

      它几乎再次重定向到 nginx,但在端口 80 上。我将其注释掉,现在一切正常。

      感谢大家的帮助。

      【讨论】:

        【解决方案3】:

        proxy_set_header X-Forwarded-Proto https;对于 SSL 卸载是正确的。您似乎期待的是 Nginx 代理 http 连接。这也是可行的,但是您需要将其单独设置为端口 80 的侦听器,然后代理与上游服务器的连接。

        基本上,您需要为端口 443 和端口 80 提供单独的服务器配置块。​​

        【讨论】:

          【解决方案4】:

          在我的 devbox 中尝试了您的配置,并进行了一些小改动。我的上游脚本从 https 访问时看到“https”,从 http 访问时看到“http”。所以你的配置有效。

          我更改的唯一行是发送到上游的 Host 标头。来自

          proxy_set_header Host $host;
          

          proxy_set_header Host my_upstream_domain_name;
          

          我将两个站点(上游/下游)托管在同一个 devbox 上。因此,如果主机头指向当前域名,而不是上游的域名,我的测试将不起作用。

          如果您的上游托管在不同的服务器上,上述更改可能与您的测试无关。

          【讨论】:

            猜你喜欢
            • 2011-01-04
            • 1970-01-01
            • 2020-08-13
            • 2018-11-09
            • 1970-01-01
            • 2018-12-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-27
            相关资源
            最近更新 更多