Tomcat 应用程序(ERDDAP 服务器)存在代理重定向问题

Tomcat 应用程序(ERDDAP 服务器)存在代理重定向问题

我在 NGINX 反向代理后面的 Tomcat 服务器上运行了一个 ERDDAP 实例。环境完全在 Kubernetes 上,RP 是一个 NGINX 入口控制器,它将端口 443 上的请求转发到与运行 Tomcat(和 ERDDAP 实例)的容器关联的端口 8080 上的服务实例。

我发现这个教程(https://www.n0r1sk.com/post/nginx-reverse-proxy-with-ssl-offloading-and-apache-tomcat-backends/) 展示了如何为反向代理后面的 Tomcat 配置 server.xml,因此我的 Tomcat 服务器的 HTTP 连接器是:

<Connector server="Apache" secure="true" port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
       proxyPort="443"
       relaxedPathChars='[]|'
       relaxedQueryChars='[]:|{}^&#x5c;&#x60;&quot;&lt;&gt;' />

使用此配置,当我请求 URL 时https://erddap.ve.ismar.cnr.it/erddap

 GET /erddap/ HTTP/1.1
 Host: erddap.ve.ismar.cnr.it
 X-Request-ID: 484e514b4038614090bf34061e9287f3
 X-Real-IP: 10.104.235.192
 X-Forwarded-For: 10.104.235.192
 X-Forwarded-Host: erddap.ve.ismar.cnr.it
 X-Forwarded-Port: 443
 X-Forwarded-Proto: https
 X-Scheme: https
 ...

我收到以下回复:

HTTP/1.1 302 
Strict-Transport-Security: max-age=0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
vary: Origin
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow- 
Credentials
Location: https://erddap.ve.ismar.cnr.it/erddap/index.html
Content-Length: 0
Date: Thu, 24 Feb 2022 17:55:41 GMT
Server: Apache

并且代理转发和后端 Tomcat 响应一切都运行正常。

但是如果我在 Tomcat Connector 配置中添加参数 scheme="https" ,如上述教程中所建议的那样:

<Connector server="Apache" secure="true" port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
       proxyPort="443"
       scheme="https"
       relaxedPathChars='[]|'
       relaxedQueryChars='[]:|{}^&#x5c;&#x60;&quot;&lt;&gt;' />

相同的请求失败并且我从 Tomcat 收到以下响应:

HTTP/1.1 302 
Strict-Transport-Security: max-age=0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
vary: Origin
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow- 
Credentials
Location: (not specified)/erddap/index.html
Content-Length: 0
Date: Thu, 24 Feb 2022 18:02:44 GMT
Server: Apache

您会注意到“Location:”标头完全错误,带有“(未指定)”前缀,导致客户端对 URL 进行后续请求https://erddap.ve.ismar.cnr.it/erddap/(not%20specified)/erddap/index.html(当然请求会失败)。

你们中有人能帮我找出 Tomcat 配置中的问题吗?为什么仅在 server.xml 中添加 scheme="https" 参数,行为就会有如此大的不同?

在此先谢谢您,Pierpaolo

答案1

您的 Tomcat 连接器配置缺少代理信息。

相关属性proxyNameproxyPort

例子:

<Connector server="Apache" secure="true" port="8080" protocol="HTTP/1.1" 
   connectionTimeout="20000"
   proxyName="example.com"
   proxyPort="443"
   scheme="https"
   relaxedPathChars='[]|'
   relaxedQueryChars='[]:|{}^&#x5c;&#x60;&quot;&lt;&gt;' />

相关内容