我正在尝试将 Apache 服务器放在 Tomcat 服务器前面。
阿帕奇的文档说明了有关该ProxyPreserveHost
选项的内容:When enabled, this option will pass the Host: line from the incoming request to the proxied host, instead of the hostname specified in the ProxyPass line.
我构建了一个简单的场景。我在 Apache 中设置了一个虚拟主机,并设置了ServerName
和ServerAlias
。我还设置了ProxyPreserveHost Off
。请求的转发由ProxyPass / ajp://tomcat001:8009/
Tomcat 的发起server.xml
,其中有一行host name="tomcat001"
。现在当我在浏览器中调用 tomcat001(碰巧设置为ServerName
- 一切正常)。当我调用tomcat001a
- 设置为 ServerAlias 的主机 - Tomcat 通知被调用的文件不存在/ROOT
- 这意味着它调用 Tomcat 的默认站点。
我现在想知道 Apache 文档中所说的 是什么意思hostname specified in the ProxyPass line
?难道他们不是指目标站点吗?我期望调用那里提供的 tomcat 主机,它可能以什么主机名到达 Apache。
添加:20161023
httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "D:/Webs/tomcat001"
ServerName tomcat001
ServerAlias tomcat001a
LogLevel debug rewrite:trace3
<Directory "D:/Webs/tomcat001">
AllowOverride All
Require all granted
DirectoryIndex index.cfm
OPTIONS +indexes
</Directory>
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass / ajp://tomcat001:8009/
ProxyPassReverse / http://tomcat001:8009/
</VirtualHost>
服务器.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="tomcat001" appBase="webapps" autoDeploy="true" unpackWARs="true">
<Context path="" docBase="D:/Webs/tomcat001">
<JarScanner scanClassPath="false"/>
</Context>
</Host>
答案1
当 HTTP 客户端请求 URL 时,客户端会将 HTTPHost
标头设置为方案和 URI 路径之间的所有内容。例如:
http://www.example.com:1234/path/to/index.html?arg1=value1&arg2=value2
- 方案 = http
- 主机名 = www.example.com
- 端口 = 1234
- URI 路径 = /path/to/index.html
- 查询字符串 = arg1=value1&arg2=value2
在这种情况下,标题Host
将是www.example.com:1234
。
使用 HTTP 代理时,默认情况下,Apache 设置的主机标头(在反向代理情况下,Apache 是客户端)将是行中 URL 的相关部分ProxyPass
。因此,如果您有:
ProxyPass / http://mytomcatapp:8009/
对后端的请求将包含带有字符串的主机标头mytomcatapp:8009
。但是对于AJP
代理来说,这不是默认设置。根据文档,https://httpd.apache.org/docs/2.4/mod/mod_proxy_ajp.html#usage,使用AJP
,Host
标题默认保留,因此在您的情况下,它将是用户浏览器设置的任何内容。
它可能可能是 tomcat 上下文问题,但您需要显示更多配置以确保无误。通常,您代理应用程序的 URI 应该与应用程序部署的 URI 路径相同。这并不是必需的,只是为了避免很多可能出现的问题。因此:
# Good
ProxyPass / http://backend.example.com:8080/
ProxyPass /app1/ http://backend.example.com:8080/app1/
# Not so good
ProxyPass / http://backend.example.com:8080/app1/
ProxyPass /app1/ http://backend.example.com:8080/
您还应该注意匹配参数和ProxyPass
指令上的尾部斜杠ProxyPassReverse
。即,两者上都存在,或者两者上都不存在。
总之,请展示更多您的配置。