如何在 Apache 2.2.x 中制作虚拟主机以将子域映射到 Servlet 上下文?

如何在 Apache 2.2.x 中制作虚拟主机以将子域映射到 Servlet 上下文?

我安装了 Tomcat 6.x 和 Apache 2.2.x。

我想将在 tomcat 上运行的应用程序映射到子域,而不必指定端口和上下文。

我想要:http://app1.mycompany.com/指向dev.mycompany.com:8080/app1/

我曾尝试使用和mod_proxy的不同组合来创建虚拟主机条目,但我无法进行设置来执行此操作。mod_rewriteajp

答案1

这应该有效:

<VirtualHost 0.0.0.0:80>
    ServerName app1.mycompany.com

    ProxyPass / http://dev.mycompany.com:8080/app1/
    ProxyPassReverse / http://dev.mycompany.com:8080/app1/
</VirtualHost>

但请注意,如果 dev.mycompany.com 上的 servlet 使用请求 URI 重定向浏览器或在 Apache 无法理解的文档中生成链接(例如,JNLP 文件),则下载将失败,因为会发生以下情况:

  1. servlet 检测到 URI /app1/
  2. servlet 生成链接,例如 /app1/this_is_needed.jar
  3. 客户端尝试下载链接,http://app1.mycompany.com/app1/this_is_needed.jar
  4. 自从全部请求被重定向到 dev.mycompany.com:8080/app1/,请求变为http://dev.mycompany.com:8080/app1/app1/this_is_needed.jar,但它并不存在。

这不适用于 html 页面,因为 Apache 将更改链接(这就是 ProxyPassReverse 的用途)。如果您需要解决我描述的错误,您有两个选择:

  1. 让 Web 应用意识到它可能需要提供与请求 URI 不同的路径。您需要找到一种方法来动态指定这些路径,例如使用环境变量(SetEnv 指令)
  2. 代理整个上下文,并在 webroot 中放置一个简单的页面,将用户重定向到 /app1/

答案2

我最终放弃了 Apache Tomcat,只使用了 Jetty,并将应用程序设置为自己的ROOT应用程序上下文。虽然不是最佳选择,但它足够轻量,直到我能弄清楚如何从 Servlet 容器中实际托管多个应用程序并让它们无缝地路由到子域和从子域路由。有人离线建议在 Tomcat 之外直接使用 Tomcat 虚拟主机,我也会调查一下。

相关内容