【问题标题】:How to get Apache Tomcat to serve my webpage from 'www.myapp.com' rather than 'www.myapp.com/myapp'?如何让 Apache Tomcat 从“www.myapp.com”而不是“www.myapp.com/myapp”为我的网页提供服务?
【发布时间】:2012-04-29 16:29:04
【问题描述】:

抱歉,如果不解释整个情况,我想不出一个更具描述性的标题。

我将 IIS7 与 Tomcat7 一起使用。 我使用 GWT 创建了一个 Web 应用程序,将其打包成一个 war 文件并部署在 Tomcat 上。
输入我的网站 url,比如“www.myapp.com”,我会看到 Tomcat 默认页面。我怀疑这是因为 %TOMCAT_HOME%/webapps/ROOT 目录中的内容。我可以通过“www.myapp.com/myapp”访问我的 web 应用程序,我期望的所有功能都在那里。

如何配置 Tomcat 以便可以通过“www.myapp.com”而不是“www.myapp.com/myapp”访问我的 webapp?

我尝试在 %TOMCAT_HOME%/conf 中配置 server.xml,方法是为我的 webapp 添加一个新的“主机”标签:

        <Host name="myapp.com" debug="0" appBase="webapps/myapp" unpackWARs="true">
              <Alias>www.myapp.com</Alias>
              <Context path="" docBase="." debug="0" reloadable="true"/> 
        </Host>

从上面添加主机标签,现在输入“www.myapp.com”将我直接带到我的网络应用程序。问题是当我在应用程序中调用 servlet(我正在使用 GWT RPC)时,我得到了错误:

com.google.gwt.user.client.rpc.StatusCodeException:404

服务器错误 404 - 找不到文件或目录。

您要查找的资源可能已被删除、名称已更改或暂时不可用。

我不知道为什么会出现这个错误,之前在没有添加“主机”标签的情况下输入“www.myapp.com/myapp”时效果很好。

我是 Tomcat 新手,不知道如何解决这个问题。 任何帮助将不胜感激。 谢谢

编辑:

a) server.xml 中的主机部分(我的默认主机为 www.myapp.com):

<Host name="localhost"  appBase="C:/Tomcat 7.0/webapps" unpackWARs="true" autoDeploy="true"></Host>


<Host name="www.myapp.com" appBase="C:/Tomcat 7.0/myapp" unpackWARs="true" autoDeploy="true">       </Host>

b) workers.properties(我已经尝试将这里的主机更改为 www.myapp.com 无济于事):

worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13

c) uriworkermap.properties:

/*=worker1

【问题讨论】:

  • 请添加以下内容的完整路径 a) webapps 目录 b) 包含应用程序 myapp 的目录/WAR。
  • a) C:/Tomcat 7.0/webapps b) C:/Tomcat 7.0/myapp 我已将它们添加到问题中,并且我还尝试将这些完整路径用于 docBase

标签: tomcat servlets iis-7 tomcat7


【解决方案1】:

你有两个选择。

  1. 将您的 WAR 重命名为 ROOT.war。

  2. 将您的 WAR 移出 Tomcat 的 appBase,然后添加一个新文件 $CATALINA_BASE/Catalina/localhost/ROOT.xml,其内容如下:

这假设您使用引擎和主机的默认名称。如果没有,请相应地调整路径。它是 $CATALINA_BASE///ROOT.war

现在您通过选项 1 使用多个主机,您需要执行以下操作,因为 appBase != docBase。如果尝试对它们使用相同的值,就会发生各种不好的事情。

有几种方法可以从现有的解决方案中找到可行的解决方案。我建议如下: 1.创建一个名为C:/Tomcat 7/webapps-myapp/ROOT的目录 2.复制C:/Tomcat 7/myapp的内容到这个新目录 3. 删除 C:/Tomcat 7/myapp 4. 将 MyApp 主机的 appBase 更改为“webapps-myapp”(或完整路径)

这会将应用程序从 C:/Tomcat 7/myapp 部署为 myapp 虚拟主机中的 ROOT(默认)应用程序。这假设您已将 myapp 应用程序部署到 C:/Tomcat 7/myapp

【讨论】:

  • 感谢您的回复。我之前读过第一个选项。我对第一个选项的问题是,如果将来我有多个我想通过 Tomcat 提供服务的 web 应用程序怎么办?第一个解决方案不是将我的 webapp 设置为默认值吗?
  • 无论如何,我现在尝试了第一个选项。当我输入“www.myapp.com”时,我得到一个没有内容的页面。它加载了我正在寻找的正确的 html 文件,但其中没有任何内容。但是,如果我输入“www.myapp.com/myapp”,我会得到我所期望的。这是否需要在 %CATALINA_HOME%/conf/web.xml 中进行一些配置?
  • 删除您添加的主机元素。只需使用 Tomcat 默认值即可。
  • 如果您为多个 Tomcat 应用程序提供服务,它们必须具有不同的上下文路径,除非您通过不同的虚拟主机为它们提供服务,在这种情况下,您将设置两个具有两个不同 appBase 值的主机,每个主机都有一个 ROOT webapp .在这种情况下,您需要谨慎对待您的 IIS 配置 - 但这将是一个单独的问题。
  • 现在只使用 1 个应用程序保持简单,我尝试删除我添加的主机元素。当我输入“www.myapp.com”时,它会加载我正在寻找的 html 页面,但其中没有任何内容。 “www.myapp.com/myapp”虽然有效。我现在很茫然。
【解决方案2】:

来自 Tomcat 7 文档

http://tomcat.apache.org/tomcat-7.0-doc/config/host.html

如果您使用的是标准主机实现,则以下 首次启动 Catalina 时会自动执行操作,如果 deployOnStartup 属性设置为 true(这是默认设置 值):

Any XML file in the Host's xmlBase directory (by default $CATALINA_BASE/conf/[engine_name]/[host_name]) is assumed to be a

包含 Context 元素(及其 关联的子元素)用于单个 Web 应用程序。网络 与这些上下文 XML 描述符中的每一个关联的应用程序 文件将首先部署。

The docBase attribute of this <Context> element must only be set if the docBase is outside the Host's appBase. For web applications

位于 Host 的 appBase 中,docBase 将是 对于 Web 应用程序,将“.xml”替换为“.war”的 XML 文件 存档或删除“.xml”的 XML 文件的名称 目录。

The path attribute must not be set. The context path used will be a slash character ("/") followed by the name of the XML file (less the

.xml 扩展名)。可以使用 # 定义多级上下文路径, 例如foo#bar.xml 用于 /foo/bar 的上下文路径。默认网页 具有 / 上下文路径的应用程序可以通过使用 名为 ROOT.xml 的文件。

Any web application archive file within the Host's appBase directory that has not already been deployed as a result of a context

XML 描述符,没有相同的对应目录 名称(没有“.war”扩展名),并且不被排除在 deployIgnore 将在接下来部署。使用的上下文路径将是 斜线字符 ("/") 后跟 Web 应用程序存档名称 少了“.war”扩展名。该规则的一个例外是 名为“ROOT.war”的 Web 应用程序存档将使用 /的上下文路径。可以使用 # 定义多级上下文, 例如使用名为 foo#bar.war 的 WAR 作为 /foo/bar 的上下文路径。

If the unpackWARs attribute is true, the web application archive file will be expanded to a directory of the same name (without the

“.war”扩展名”。

Note: If you re-deploy an updated WAR file while Tomcat is stopped, be sure to delete the associated expanded directory before

重启Tomcat,使更新后的WAR文件重新展开 当 Tomcat 重新启动时。

If copyXML is true (it is false by default), any web application archive file within the Hosts's appBase directory that does not have a

对应的上下文 XML 描述符(带有“.xml”扩展名而不是 将扫描主机的 xmlBase 中的“.war”扩展名)以查看 如果它包含上下文 XML 描述符(位于 /META-INF/context.xml),如果找到,描述符将是 复制到xmlBase目录并重命名。

Finally, any sub-directory within the Host's appBase that has not already been deployed as a result of a context XML descriptor and is

没有被 deployIgnore 排除的将被部署。使用的上下文路径 将是一个斜杠字符 ("/"),后跟目录名称,除非 目录名称是 ROOT,在这种情况下上下文路径将为 /。 可以使用 # 定义多级上下文,例如使用目录 为 /foo/bar 的上下文路径命名为 foo#bar。

If copyXML is true (it is false by default), any directory within the Hosts's appBase directory that does not have a corresponding

Host 的 xmlBase 中的上下文 XML 描述符将被扫描以查看是否 它包含一个上下文 XML 描述符(位于 /META-INF/context.xml),如果找到,描述符将是 复制到xmlBase目录并重命名。

这一切的要点:

a web application archive named "ROOT.war" will be deployed with a context path of /.

【讨论】:

  • 这个答案有问题。 1. 它引用了 Tomcat 3.2 文档来解决 Tomcat 7 问题。 2. 不鼓励在 server.xml 中定义上下文。 3.这种配置会导致双重部署。
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2016-10-29
  • 2023-03-07
相关资源
最近更新 更多