将多个域转换为 Tomcat 应用中的路径

Translating multiple domains to paths in a Tomcat app

如果我有 2 个域和 2 个子域:

examples.com
dogs.tutorials.com
cats.tutorials.com

我想从一台 Tomcat 服务器为它们提供服务,作为来自以下应用程序入口路径的 Java 应用程序:

localhost/app/examples/
localhost/app/tutorials/dogs/
localhost/app/tutorials/cats/

例如:

dogs.tutorials.com/search/?f=terrier

应翻译为:

/tutorials/dogs/search/?f=terrier

是否可以配置 Apache 或 Tomcat 来实现这个目标?怎么样? 我不确定是否需要 apache。这是一个 java 应用程序,因此 apache 不应提供任何内容,只是可用于将路径转换为域,我不想使用不同的端口,因为这将是一个应用程序。)

这也需要实时重写来自服务器的响应,因为您的网络应用程序创建的任何 url 都会说 /tutorials/dogs/search/?f=terrier,并且必须由 Apache 前端重写为 dogs.tutorials.com/search/?f=terrier.

更新:组合mod_rewrite and mod_substitution应该可以了

出于性能和复杂性的原因,我不推荐这样做。

但是,如果这 3 个 URL 实际上是 3 个不同的网络应用程序,那么您可以使用 virtual hosting 来实现,其中 3 个网络应用程序是 ROOT 个用于 3 个不同虚拟主机的应用程序。

我用 mod_proxy, and mod_substitute 解决了:

----------------------
#required modules
LoadModule substitute_module modules/mod_substitute.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_module modules/mod_proxy.so
----------------------

<Location "/">
    AddOutputFilterByType SUBSTITUTE text/html
</Location>

<VirtualHost *:80>
    ServerName examples.com
    ProxyPreserveHost On
    ProxyPass           / http://localhost:8080/TestWebApp/examples/
    ProxyPassReverse    / http://localhost:8080/TestWebApp/examples/
    Substitute          "s|/TestWebApp/examples||in"
</VirtualHost>

<VirtualHost *:80>
    ServerName dogs.tutorials.com
    ProxyPreserveHost On
    ProxyPass           / http://localhost:8080/TestWebApp/tutorials/dogs/
    ProxyPassReverse    / http://localhost:8080/TestWebApp/tutorials/dogs/
    Substitute          "s|/TestWebApp/tutorials/dogs||in"
</VirtualHost>

<VirtualHost *:80>
    ServerName cats.tutorials.com
    ProxyPreserveHost On
    ProxyPass           / http://localhost:8080/TestWebApp/tutorials/cats/
    ProxyPassReverse    / http://localhost:8080/TestWebApp/tutorials/cats/
    Substitute          "s|/TestWebApp/tutorials/cats||in"
</VirtualHost>

仅当响应页面中也有非相关链接时才需要替换,因此它会替换它们(注意,替换每个匹配的字符串)。