tomcat7 + nginx ssl 导致重定向循环

tomcat7 + nginx ssl 导致重定向循环

我们的设置如下:多个子域名指向同一个服务器,该服务器运行 nginx 作为每个子域名的代理。所有子域名目前都用于测试开发中的功能,因此其内容大致相同。

每个 nginx 站点配置文件大致如下

server {

listen       80;
server_name  full.web.address;

location / {
    proxy_pass              http://devhost:8080;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        Host $http_host;

    proxy_cache global;
    proxy_cache_valid  200 302  600m;
    proxy_cache_valid  404      1m;

}

location /robots.txt {
    alias   /var/www/default/robots.txt;
}

}

server {

listen       443;
server_name  full.web.address;

location / {

    proxy_pass              http://devhost:8080/;

    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        Host $http_host;
    proxy_set_header        X-Forwarded-Proto https;

    proxy_cache global;
    proxy_cache_valid  200 302  600m;
    proxy_cache_valid  404      1m;
}

location /robots.txt {
     alias   /var/www/default/robots.txt;
}

ssl                  on;
ssl_certificate      /etc/nginx/combined.crt;
ssl_certificate_key  /etc/nginx/cert.key;
ssl_session_timeout  5m;
ssl_protocols  SSLv2 SSLv3 TLSv1;
}

devhost 或任何其他主机名,在重启时由脚本在 /etc/hosts 中设置。我们现在有三台 Tomcat 7 服务器正在运行,在它们的所有 web.xml 文件中,我们都有以下内容:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Confidential resources</web-resource-name>
        <url-pattern>/manager/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>
            CONFIDENTIAL
        </transport-guarantee>
    </user-data-constraint>
</security-constraint>

每个 server.xml 都有相同的内容:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8" />

<Engine name="Catalina" defaultHost="full.web.address">


  <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>
  </Realm>

  <Host name="full.web.address"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
       remoteIpHeader="x-forwarded-for"
       remoteIpProxiesHeader="x-forwarded-by"
       protocolHeader="x-forwarded-proto"
    />
    <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" />

  </Host>
</Engine>

它们也使用相同的 WAR 文件。我实际上复制了所有内容,只是更改了名称和 IP 地址。问题是,在其中一个文件中,https://full.web.address/manager/没有问题,但在其他情况下,它会进入无限重定向循环。设置和内容完全相同。

答案1

新的一天,新的想法。我查看了 Tomcat 的 Valve 文档,它提供了答案https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html在内部代理中:

默认情况下,允许 10/8、192.168/16、169.254/16 和 127/8;172.16/12 默认未启用,因为用正则表达式描述比较复杂

无法正常工作的服务器位于 172.16/12 子组中,因为它位于 Docker 容器中。由于外部无法访问它,并且其端口未被转发,因此可以安全地设置 internalProxies=".*"

答案2

“172.16/12 默认未启用,因为用正则表达式描述起来很复杂”这句话让我第一次读到时感到很尴尬。无论如何,你可以直接复制粘贴正则表达式RemoteIpValve 的 Tomcat 8 文档.以下是完整示例:

      <Valve className="org.apache.catalina.valves.RemoteIpValve"
         internalProxies="10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}| 169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}| 172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}| 172\.3[0-1]{1}\.\d{1,3}\.\d{1,3}"
         protocolHeader="X-Forwarded-Proto" />

也许您可以将其纳入您的答案中?

相关内容