我在 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='[]:|{}^\`"<>' />
使用此配置,当我请求 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='[]:|{}^\`"<>' />
相同的请求失败并且我从 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 连接器配置缺少代理信息。
相关属性proxyName
是proxyPort
例子:
<Connector server="Apache" secure="true" port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
proxyName="example.com"
proxyPort="443"
scheme="https"
relaxedPathChars='[]|'
relaxedQueryChars='[]:|{}^\`"<>' />