使用 HTTPS 在 Apache 后面配置 Tomcat8
Configure Tomcat8 behind Apache with HTTPS
我在服务器的 8080 端口安装了 Tomcat 8,我使用安全的 Apache(使用 Proxy Pass)公开它。
这是我的 Apache 配置:
<VirtualHost *:443>
ServerName myserver.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /odata/ http://172.31.36.251:8080/
ProxyPassReverse /odata/ http://172.31.36.251:8080/
<Proxy *>
allow from all
</Proxy>
RequestHeader set X-Forwarded-Port 443
RequestHeader set X-Forwarded-Scheme https
</VirtualHost>
这里是Tomcatserver.xml配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
address="172.31.36.251"
proxyName="myserver.com"
scheme="https" proxyPort="443" />
到这里为止一切正常。如果我调用我的应用程序:
https://myserver.com/odata/D3a1593adae89/odata.svc/
我得到:
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://myserver.com:443/D3a1593adae89/odata.svc/">
<workspace>
<atom:title>Default</atom:title>
<collection href="Maintables">
<atom:title>Maintables</atom:title>
</collection>
</workspace>
</service>
问题:如果在结果中看到属性xml:base,Tomcat修饰地址有了端口,我真的不知道如何删除它。地址也是错误的:应该是 https://myserver.com:443/odata/D3a1593adae89/odata.svc/ . I been looking around and trying things like setting proxyPort to blank but nothing. I think this is related to broken links when using a reverse proxy as described at https://cwiki.apache.org/confluence/display/HTTPD/TomcatModProxyHTML 。我尝试了一些重写,例如:
ProxyHTMLURLMap http://172.31.33.105:8080 /odata
RewriteEngine On
RewriteRule ^/odata$ https://myserver.com/odata/ [R,L]
但我无法让它工作。 xml:base 应该是 https://myserver.com/odata/D3a1593adae89/odata.svc/
任何想法表示赞赏
对于端口,当您使用 ProxyPreserveHost On
并设置 X-Forwarded-*
headers 时,您可以使用 RemoteIpValve
:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" />
连接器将是:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443"
address="172.31.33.105"
/>
Valve 检测到 proto
并将假定连接已通过默认端口号 (https://xxxxx/yyy
) 保护。
对于位置,您应该在 odata
上下文中部署您的应用程序,以便您可以使用
ProxyPass /odata http://172.31.33.105:8080/odata
修改代理传递的上下文(从 /odata/ 到 /)有点棘手,因为您需要过滤来自后端服务器的所有文本以修复一些 url 路径。这真的很痛苦(我应该用“/odata/xxx”替换所有“/xxx”吗?)
我在服务器的 8080 端口安装了 Tomcat 8,我使用安全的 Apache(使用 Proxy Pass)公开它。
这是我的 Apache 配置:
<VirtualHost *:443>
ServerName myserver.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /odata/ http://172.31.36.251:8080/
ProxyPassReverse /odata/ http://172.31.36.251:8080/
<Proxy *>
allow from all
</Proxy>
RequestHeader set X-Forwarded-Port 443
RequestHeader set X-Forwarded-Scheme https
</VirtualHost>
这里是Tomcatserver.xml配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
address="172.31.36.251"
proxyName="myserver.com"
scheme="https" proxyPort="443" />
到这里为止一切正常。如果我调用我的应用程序: https://myserver.com/odata/D3a1593adae89/odata.svc/
我得到:
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://myserver.com:443/D3a1593adae89/odata.svc/">
<workspace>
<atom:title>Default</atom:title>
<collection href="Maintables">
<atom:title>Maintables</atom:title>
</collection>
</workspace>
</service>
问题:如果在结果中看到属性xml:base,Tomcat修饰地址有了端口,我真的不知道如何删除它。地址也是错误的:应该是 https://myserver.com:443/odata/D3a1593adae89/odata.svc/ . I been looking around and trying things like setting proxyPort to blank but nothing. I think this is related to broken links when using a reverse proxy as described at https://cwiki.apache.org/confluence/display/HTTPD/TomcatModProxyHTML 。我尝试了一些重写,例如:
ProxyHTMLURLMap http://172.31.33.105:8080 /odata
RewriteEngine On
RewriteRule ^/odata$ https://myserver.com/odata/ [R,L]
但我无法让它工作。 xml:base 应该是 https://myserver.com/odata/D3a1593adae89/odata.svc/
任何想法表示赞赏
对于端口,当您使用 ProxyPreserveHost On
并设置 X-Forwarded-*
headers 时,您可以使用 RemoteIpValve
:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" />
连接器将是:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443"
address="172.31.33.105"
/>
Valve 检测到 proto
并将假定连接已通过默认端口号 (https://xxxxx/yyy
) 保护。
对于位置,您应该在 odata
上下文中部署您的应用程序,以便您可以使用
ProxyPass /odata http://172.31.33.105:8080/odata
修改代理传递的上下文(从 /odata/ 到 /)有点棘手,因为您需要过滤来自后端服务器的所有文本以修复一些 url 路径。这真的很痛苦(我应该用“/odata/xxx”替换所有“/xxx”吗?)