使用 AJP 的 tomcat 之前的 Apache 的 ProxyPreserveHost

使用 AJP 的 tomcat 之前的 Apache 的 ProxyPreserveHost

我正在尝试将 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 中设置了一个虚拟主机,并设置了ServerNameServerAlias。我还设置了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 &quot;%r&quot; %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,使用AJPHost标题默认保留,因此在您的情况下,它将是用户浏览器设置的任何内容。

可能可能是 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。即,两者上都存在,或者两者上都不存在。

总之,请展示更多您的配置。

相关内容