我找到了解决方案:
在我的Tomcat server.xml中,我需要编辑http连接器并添加其他属性:
proxyName="my.server.domain"
因此它显示为:
<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" proxyPort="80" proxyName="my.server.domain" />
这允许由tomcat托管的spring mvc webapp构造类似于以下内容的url:
http://my.server.domain/acme
代替:
http:// localhost / acme
========================================
缺少属性:proxyName =“ my.server.domain” —时发生的问题是:
Tomcat上托管的spring mvc webapp正在构造用于处理请求的url,并询问Tomcat:“您的服务器名是什么?”
-Tomcat答复“本地主机”(Tomcat从Apache代理接收请求的值)。因此,spring在构造类似于以下内容的网址时使用了“ localhost”:
http:// localhost / acme
前端的Apache代理从Tomcat响应(从spring mvc
webapp响应)接收这些URL,而Apahe代理正在将最终用户客户端的URL转到以下网址: http:// localhost /
acme 最终用户客户端肯定可以没有在本地计算机上托管该Web应用程序-
因此浏览器向他们提供了:HTTP错误404
========================================
可以从apache代理配置中清楚地看到这一点:
ProxyPass /acme http://localhost:8080/acmeProxyPassReverse /acme http://localhost:8080/acme
Apache将请求中包含“
localhost”的URL发送给tomcat。Tomcat连接器响应必须为Apache指定真实的proxyName(而不是localhost),该名称应返回给客户端。
========================================
Tomcat连接器文档:
- proxyName
如果在代理配置中使用了此连接器,请配置此属性以指定要为调用request.getServerName()返回的服务器名称。有关更多信息,请参见代理支持。
代理支持
当Tomcat在代理服务器后面运行时,可以使用proxyName和proxyPort属性。这些属性修改返回给Web应用程序的值,这些Web应用程序调用request.getServerName()和request.getServerPort()方法,这些方法通常用于构造用于重定向的绝对URL。如果不配置这些属性,则返回的值将反映接收到来自代理服务器的连接的服务器名称和端口,而不是客户端将原始请求定向到的服务器名称和端口。*
===========================================
如果您有像spring
mvc这样的Web应用程序正在构造url,那么很多在线博客(提到如何使tomcat连接器仅在127.0.0.1上侦听)都没有解释必须在proxyPort之外设置proxyName。您正在使用apache
mod代理将localhost的请求URL发送到Tomcat。



