如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?

Posted

技术标签:

【中文标题】如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?【英文标题】:How to set context path in Tomcat so one could enter the site without appending the deployed folder name? 【发布时间】:2012-01-12 14:25:10 【问题描述】:

我在 Tomcat 指南 here 和一些 SO 问题上阅读了有关此内容的信息。而且我认为我几乎在做同样的事情。但在某种程度上无法成功。

首先我必须说我的应用程序部署在我无法控制的共享 Tomcat 服务器上。我只需删除我的 .war 文件,它就会被部署。

我尝试将我的应用程序打包为 ROOT.war,但没有成功。管理员告诉我把它打包成我想要的任何名字,他们会照顾它。 我将其打包为 my-application.war 并已部署,但我必须输入 http://my-host/my-application 才能访问网站。

在联系管理员后,他们告诉我他们已经在我的主机中的 Tomcat 配置文件中放置了一个上下文元素,例如:

<Context path="" docBase="path of my-application deployed folder"/>

应该将 my-application 设置为所有到达 my-host 的请求的默认应用程序。但它没有,每当我输入 http://my-host 我都会得到:

HTTP Status 404 - / The requested resource (/) is not available

但是当我再次输入 http://my-host/my-application 时,一切正常。任何关于可能出错的建议都非常感谢。

更新: 我尝试按照how to make the application default 上的tomcat 文档中描述的步骤进行操作。描述了 3 种方法,我尝试了所有三种方法,并且可以成功地将我的应用程序部署为 localhost 上的 ROOT。

我还尝试在远程服务器上重现我面临的问题,以便找到原因并将其报告给管理员。我发现了几个问题。

    在管理员发送给我的 server.xml 片段中,autoDeploydeployOnStartUp 设置为 true,而如果明确定义 Context,它们应该为 false server.xml 中的元素。这将导致双重部署,即创建一个 ROOT 文件夹和一个名为 .war 文件的文件夹。删除 .war 将删除它的相应文件夹并取消部署应用程序,但 ROOT 仍然存在,必须手动删除,并且需要重新启动 Tomcat。在重新启动之前,ROOT.war 的任何部署都会失败。 我认为有一些原因会阻止 ROOT.war 部署。一种可能是 ROOT.xml 存在于 conf/engine-name/host-name 或者主机的 appBase 中存在 ROOT 文件夹,或者如上所述,之前部署的 ROOT 应用程序未取消部署,需要重新启动 Tomcat。

无论哪种方式,我都无法准确指出阻止 ROOT.war 部署的确切原因,因为这需要访问 Tomcat 日志文件和 conf 文件来检查我上面描述的情况。

此外,从我看来,我的管理员似乎无法维护 Tomcat 服务器并找到问题所在。因此,在与共享服务器苦苦挣扎后,我决定使用专用的 Tomcat 服务器。

【问题讨论】:

Tomcat 是独立使用并提供 HTTP 服务,还是有另一台服务器处理它并通过 AJP 与 Tomcat 通信?听起来好像有一些虚拟主机正在进行。是在 Tomcat 的主要 server.xml 中定义的,还是在 conf/Catalina 下作为单独的主机特定配置文件完成的? 我刚刚尝试将上下文路径添加到我的 tomcat 的 server.xml 文件中,它像冠军一样进行了重定向。我所做的只是放置 docBase="my-application" 而不是绝对路径或类似的东西。在上面的示例代码中,“我的应用程序部署文件夹的路径”是什么意思? 另外,您是否有权访问包含 元素的整个 元素?根据其设置,它可能会阻止上下文设置按预期工作。 @JeffGoldberg 上面的路径是绝对的。我无权访问 元素,但我已经看到它并且它具有它的默认属性。里面只有我上面描述的 元素。我会尝试让管理员给它一个相对路径。 【参考方案1】:

通常可以通过以下步骤来实现:

在 conf/Catalina/localhost 中定义一个 ROOT.xml 上下文文件 将您的 webapp WAR 命名为“ROOT.war”或包含文件夹“ROOT”

但是,我怀疑您能否在共享的 Tomcat 实例上执行此操作。只有一个应用程序可以作为默认应用程序运行。托管公司可能不会允许,否则他们将允许哪个应用程序成为共享同一个 Tomcat 实例的许多人中的默认应用程序?

查看此链接:http://staraphd.blogspot.com/2009/10/change-default-root-folder-in-tomcat.html

【讨论】:

感谢您的参考。但我无法控制文章建议的大部分内容。而且我认为管理员已经像我提到的那样设置了上下文部分。 如果管理员已经设置了你的上下文路径...你的答案是,如果不让用户进入某个“文件夹”,比如 http//myapp.com/myapp,你就无法做到这一点.解决这个问题的唯一方法是让管理员将您部署为 ROOT.war 或从 ROOT.xml 指向您的战争。 @Bob 根据here,我上面描述的方法应该将应用程序设置为默认值。虽然我不清楚它是否会覆盖 ROOT 应用程序并成为新的 ROOT,或者它只是作为未分配给 ROOT 的应用程序的默认值以及已经定义的任何其他上下文,我认为后者没有意义.【参考方案2】:

Tomcat Wiki 有一个section 用于将应用程序置于默认上下文中。 但是,为了做到这一点,它意味着对 Tomcat 服务器的一些控制,这在您描述的共享上下文中可能是不可能的。

如果您能够在服务器上安装其他系统,另一种解决方案是使用 nginx 之类的代理服务器。这比简单地命名您的战争文件 ROOT.war 复杂得多,但有时它是唯一的选择。

如果你有 NGINX 在服务器上监听并且你有自己的 url,你可以使用 HttpProxyModule 并设置如下:

server 
        listen          80;
        server_name     my.domain.com;
        location / 
            proxy_pass              http://my-host/my-application;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        
    

此外,为了使这项工作正常进行,您必须拥有“my.domain.com”网址 并且它需要与每个人用于共享 Tomcat 的网址分开服务器。

解决方案的 nginx 部分是免费的,但如果您需要注册一个新的 url,然后使用 no-ip.com 之类的东西将其重定向到 tomcat 服务器,则需要花钱。

【讨论】:

我想我宁愿坚持配置 Tomcat 来获得结果。无论如何,谢谢。 是的,我想。此解决方案实际上更适用于您有很多站点和大量 URL 需要重定向的情况。但我认为这可能对某人有帮助。 它对我有用。谢谢你的提示。 URL 末尾的每个应用程序的“上下文”让我非常恼火。【参考方案3】:

在您的问题中,您声明管理员将上下文设置为:

<Context path="" docBase="path of my-application deployed folder"/>

基于上面的 cmets,我建议尝试使用应用程序的 relative 路径,而不是 absolute 路径。

我在我的 tomcat 服务器上试过这个:

<Context path="/" docBase="my-application/" />

这样就成功了。

包含 Context 元素的 Host 元素确实设置了一些可能也会影响上下文的参数。如果它是默认设置,那么相对上下文应该只是指向 webapps 文件夹。如果已更改,结果可能会有所不同。

【讨论】:

我尝试使用相对路径以防万一 appBasedocBase 的绝对路径有一些冲突,但这似乎不是问题。 你为我节省了很多时间。非常感谢。 我试图给出相对路径而不是给出绝对路径,但是tomcat服务器没有运行..

以上是关于如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?的主要内容,如果未能解决你的问题,请参考以下文章

如何在idea中设置Tomcat虚拟路径

如何在 Wildfly 中定义上下文路径?

如何在 Spring Boot Tests 中设置 servlet 上下文路径?

在tomcat 7中设置默认应用程序

在tomcat中设置上下文变量

如何在不使用 %s 的情况下安全、动态地在查询中设置列名?