我在服务器上的端口8080中安装了Tomcat 8,我正在使用安全的Apache(使用Proxy Pass)对其进行公开。
这是我的Apache配置:
<VirtualHost *:443>
ServerName myserver.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /odata/ http://172.31.33.105:8080/
ProxyPassReverse /odata/ http://172.31.33.105:8080/
<Proxy *>
allow from all
</Proxy>
RequestHeader set X-Forwarded-Port 443
RequestHeader set X-Forwarded-Scheme https
</VirtualHost>
这是Tomcat server.xml配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
address="172.31.33.105"
proxyName="myserver.com"
scheme="https" />
一切正常,直到这里。如果我致电我的申请: 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用端口装饰地址,而我真的不知道如何删除它。最初,Tomcat没有 scheme =“ https” 的装饰,就像 http://myserver.com.com:80 一样装饰了xml:base。我一直在环顾四周,尝试将 proxyPort 设置为空白但什么也没做。
答案 0 :(得分:1)
对于端口,使用ProxyPreserveHost On
并设置X-Forwarded-*
标头时,可以使用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"
/>
阀门检测到proto
,并假定使用默认端口号(https://xxxxx/yyy
)来确保连接的安全性。
对于位置,您应该在odata
上下文中部署应用程序,以便可以使用
ProxyPass /odata http://172.31.33.105:8080/odata
修改代理传递(从/ odata /到/)上的上下文有些棘手,因为您将需要过滤来自后端服务器的所有文本以修复某些url路径。真的很痛苦(我应该用“ / odata / xxx”替换所有的“ / xxx”吗?)