【问题标题】:Translating multiple domains to paths in a Tomcat app将多个域转换为 Tomcat 应用程序中的路径
【发布时间】:2016-05-27 22:30:15
【问题描述】:

如果我有 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 不应该提供任何内容,只是可能用于将路径转换为域,我不想使用不同的端口,因为这将是一个应用程序。)

【问题讨论】:

    标签: java apache tomcat url-routing


    【解决方案1】:

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

    更新:mod_rewritemod_substitution 的组合应该可以做到。

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

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

    【讨论】:

    • 是的,当然还有回复。不是不同的应用程序,请问如何处理一个应用程序在不同的路径。
    • 我知道性能和复杂性问题,这些只是简单的在线工具,可能位于由一个应用程序库提供服务的不同域或子域上。
    • 例如这是在线的:log4jtester.com,我想在分离的域上使用更多工具扩展项目。代码将保持干净,拥有一个应用程序比分离更简单,而且流量非常低。
    • 实际上,我认为将不同域的代码分成单独的 webapps 是一种更“干净”的方式。然后,您还可以独立重新启动和更新它们。而且您将来很可能需要将它们托管在不同的 Tomcat 实例上,因为它们变得如此流行以至于您需要向外扩展。
    • 我理解你的意思,当然代码会由不同的模块构建,只是组装到单个应用程序中,因为它也有一些通用的代码库。我现在发现这是最简单的方法,当需要制作单独的应用程序时,它仍然很简单。另一方面,这个问题针对的是这种情况,即使它是否合理,也可能对其他人有所帮助。
    【解决方案2】:

    我用mod_proxymod_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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2013-01-06
      • 2021-06-04
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      相关资源
      最近更新 更多