使用 HTTPS 在 Apache 后面配置 Tomcat8

QLa*_*nds 5 https apache2 proxypass tomcat8

我在我的服务器中的 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>
Run Code Online (Sandbox Code Playgroud)

这里是Tomcat server.xml 配置

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" 
            address="172.31.36.251" 
            proxyName="myserver.com" 
            scheme="https" proxyPort="443"  />
Run Code Online (Sandbox Code Playgroud)

一切正常,直到这里。如果我调用我的应用程序: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>
Run Code Online (Sandbox Code Playgroud)

问题: 如果在结果中看到属性xml:base,Tomcat用端口装饰地址,我真的不知道如何删除它。地址也是错误的:它应该是https://myserver.com:443/ odata /D3a1593adae89/odata.svc/ 。我一直在环顾四周,尝试将proxyPort设置为空白但什么也没有。我认为这与使用反向代理时断开的链接有关,如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]
Run Code Online (Sandbox Code Playgroud)

但我就是无法让它发挥作用。xml:base 应该是https://myserver.com/odata/D3a1593adae89/odata.svc/

任何想法表示赞赏

war*_*gre 1

对于端口事物,当您使用ProxyPreserveHost On并设置X-Forwarded-*标头时,您可以使用RemoteIpValve

<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" /> 
Run Code Online (Sandbox Code Playgroud)

连接器将很简单:

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="443" 
            address="172.31.33.105" 
             />
Run Code Online (Sandbox Code Playgroud)

阀门检测到proto并假定连接已使用默认端口号 ( https://xxxxx/yyy) 进行保护。

对于位置,您应该在odata上下文中部署您的应用程序,以便您可以使用

    ProxyPass           /odata    http://172.31.33.105:8080/odata
Run Code Online (Sandbox Code Playgroud)

修改代理传递上的上下文(从 /odata/ 到 /)有点棘手,因为您需要过滤来自后端服务器的所有文本来修复某些 url 路径。这真的很痛苦(我应该用“/odata/xxx”替换所有“/xxx”吗?)