将多个域转换为 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>
仅当响应页面中也有非相关链接时才需要替换,因此它会替换它们(注意,替换每个匹配的字符串)。
如果我有 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>
仅当响应页面中也有非相关链接时才需要替换,因此它会替换它们(注意,替换每个匹配的字符串)。