Tomcat:一个webapp的两个上下文路径

时间:2009-11-11 16:47:37

标签: tomcat

问题是: 我有一个Web应用程序,此Web应用程序已部署到$TOMCAT_HOME/webapps/XXX目录。 我可以在http://localhost:8080/XXX地址上找到该信息 但是,我也想访问http://localhost:8080/YYY地址上的网络应用程序。 我将以下内容添加到server.xml:

<Server>
    <Service>
        <Engine>
            <Host>
                .......
                <Context path="/YYY" docBase="XXX"></Context>
            </Host>
        </Engine>
    </Service>
</Server>

它有所帮助,但Tomcat启动了两个Web上下文,它引起了一些其他问题。 是否可以为一个Web应用程序创建“多个”地址?

3 个答案:

答案 0 :(得分:4)

Web应用程序的URL如下所示:

PROTOCOL:// DOMAIN:PORT / CONTEXT /页面名称

在两个不同地址上拥有相同应用程序的解决方案如下:

  1. 如果你想只在协议上区别(比如在http和https之间),那么在server.xml中只有2个连接器。

  2. 如果您想在DOMAIN名称上有所不同,那么这将在DNS级别上解决。

  3. 如果要在上下文名称(Web应用程序名称)上有所不同,则应将apache放在前面(mod_proxy或mod_ajp),然后创建重写规则(mod_rewrite)。让我们说从/a/*/b/*改写为/c/*

  4. 如果您希望页面名称不同,则应使用servlet映射。

  5. 通过mod_proxy将apache放在tomcat前面非常简单,网上有多个资源。非常糟糕的是复制应用程序(将所有内容加载两次)。

    至于你的问题,我会再次建议在server.xml中复制。

    <Context docBase="myapp" path="/address1" reloadable="true" />
    <Context docBase="myapp" path="/address2" reloadable="true" />
    

    这对于记忆,会话机制,可靠性等都是杀手锏。

答案 1 :(得分:0)

尝试使用Tomcat的Rewrite Valve(文档here

{TOMCAT_HOME} /conf/server.xml

<Host name="localhost" ... >
    <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Host>

{TOMCAT_HOME} /conf/Catalina/localhost/rewrite.config

RewriteCond %{REQUEST_URI} ^/XXX/.*$
RewriteRule ^/XXX/(.*)$ /YYY/$1 [L]

请在Tomcat 9文档(here)中注意此安全警告,

安全警告:由于Java的正则表达式匹配完成的方式,格式不正确的正则表达式模式容易受到“灾难性回溯”(也称为“正则表达式拒绝服务”或ReDoS)的攻击。因此,应特别注意RewriteRule模式。通常,很难自动检测到这种易受攻击的正则表达式,因此,好的防御方法是对灾难性的回溯问题有所了解。 OWASP ReDoS指南是一个很好的参考。

答案 2 :(得分:-3)

尝试使用crossContext属性:

<Context path="/YYY" docBase="XXX" crossContext="true"></Context>