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


我在Tomcat指南上读到了这个 这里 还有一些问题。而且我认为我几乎都在做同样的事情。但在某种程度上无法成功。

首先,我必须说我的应用程序部署在我无法控制的共享Tomcat服务器上。我放弃了 。战争 文件,它被部署。

我试图打包我的应用程序 ROOT.war 但没有奏效。管理员告诉我把它打包成我想要的名字,他们会照顾它。 我把它打包成了 我-application.war 它已部署但我必须进入 HTTP://我的主机/我的应用 去网站。

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

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

这应该是设定的 我的应用程序 作为所有请求的默认应用程序 my-host。但它并没有,每当我进入 HTTP://我的主机 我明白了:

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

但是当我进入时 HTTP://我的主机/我的应用 一切正常。任何关于可能出错的建议都是绝对值得赞赏的。

更新:
我试着按照tomcat文档中描述的步骤进行操作 如何使应用程序默认。描述了3种方式,我尝试了所有三种方式,并且可以在localhost上将我的应用程序成功部署为ROOT。

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

  1. server.xml中 管理员发给我的片段 自动部署 和 deployOnStartUp 设置为true,如果在server.xml中显式定义Context元素,则它们应该为false。这将导致双重部署,从而创建一个ROOT文件夹和一个名为.war文件的文件夹。删除.war将删除它的相应文件夹并取消部署应用程序,但ROOT仍然存在,必须手动删除并需要重新启动Tomcat。在重新启动之前,ROOT.war的任何部署都将失败。
  2. 我认为有一些原因阻止了ROOT.war的部署。一个可能是那个 的ROOT.xml 存在于 的conf / {引擎名称} / {主机名} 或者主机的appBase中存在ROOT文件夹,或者如上所述,以前部署的ROOT应用程序未取消部署,需要重新启动Tomcat。

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

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


6224
2017-12-04 12:26


起源

Tomcat是独立使用还是服务HTTP,还是有其他服务器处理它并通过AJP与Tomcat通信?听起来有一些虚拟主机正在进行中。这是在Tomcat的主要定义 server.xml 或者作为单独的主机特定配置文件完成 conf/Catalina? - laz
我只是尝试将上下文路径添加到我的tomcat的server.xml文件中,它像champ一样重定向。我所做的就是把docBase =“my-application”放进去,而不是绝对的路径或类似的东西。在上面的示例代码中,“我的应用程序部署文件夹的路径”是什么意思? - Jeff Goldberg
此外,您是否可以访问包含<context>元素的整个<host>元素?根据其设置,它可能会阻止上下文设置像您期望的那样工作。 - Jeff Goldberg
@JeffGoldberg上面的路径是绝对的。我无法访问<Host>元素,但我已经看过它并且它具有默认属性。里面只有我上面描述的<Context>元素。我会尝试让管理员给它一个相对路径。 - doctrey


答案:


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

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

根据上面的评论,我建议尝试使用 相对的 你的应用程序的路径而不是 绝对 路径。

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

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

这就是诀窍。

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


5
2017-12-14 15:40



我尝试了相对路径,以防万一的绝对路径 的appBase 和 的docBase 有一些冲突,但这似乎不是问题。 - doctrey
你救了我很多时间。非常感谢。 - gis_wild
我试图给出相对路径而不是给出绝对路径,但是tomcat服务器没有运行.. - M.S.Naidu


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

  • 在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


4
2017-12-04 12:40



谢谢你的参考。但我无法控制文章提出的大部分内容。而且我认为管理员已经按照我的提及设置了上下文部分。 - doctrey
如果管理员已经设置了你的上下文路径...有你的答案,你不能在没有用户进入像http // myapp.com / myapp这样的“文件夹”的情况下这样做。您可以通过此方法获得管理员将您部署为ROOT.war或从ROOT.xml获取战争指向的唯一方法。 - Bob Kuhar
@Bob据说 这里 我上面描述的方法应该将应用程序设置为默认值。虽然我不清楚它是否会覆盖ROOT应用程序并成为新的ROOT,或者它只是作为默认情况下未分配给ROOT的应用程序以及已定义的任何其他上下文,后者没有意义我认为。 - doctrey


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

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

如果你有NGINX在服务器上监听并且你有自己的网址,你可以使用 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服务器,它将花费金钱。


3
2017-12-04 13:10



我想我宁愿配置Tomcat来获得结果。不管怎么说,还是要谢谢你。 - doctrey
是的,我想。此解决方案实际上更适用于您有大量站点和大量重定向URL的情况。但我认为这可能对某人有所帮助。 - Jeff Goldberg
它对我有用。谢谢你的提示。我对网址末尾的每个应用程序的“上下文”感到非常恼火。 - alfredocambera