如何在 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 片段中,autoDeploy 和 deployOnStartUp 设置为 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" 而不是绝对路径或类似的东西。在上面的示例代码中,“我的应用程序部署文件夹的路径”是什么意思?
另外,您是否有权访问包含 通常可以通过以下步骤来实现:
在 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 文件夹。如果已更改,结果可能会有所不同。
【讨论】:
我尝试使用相对路径以防万一 appBase 和 docBase 的绝对路径有一些冲突,但这似乎不是问题。 你为我节省了很多时间。非常感谢。 我试图给出相对路径而不是给出绝对路径,但是tomcat服务器没有运行..以上是关于如何在 Tomcat 中设置上下文路径,以便在不附加部署文件夹名称的情况下进入站点?的主要内容,如果未能解决你的问题,请参考以下文章