最近我将我的 tomcat 服务器从 6.x 版本升级到了最新的 7.x 版本。
我想到了一些小麻烦,希望能够得到帮助。
我有一个应用程序调用 MyApp
在 tomcat6 上,当我去http://www.example.com/MyApp/page/ 我通常会得到想要的结果。
现在,在 tomcat7 上,访问完全相同的 url(带有尾随斜杠),我收到错误:“资源不可用”,因为 tomcat 认为 /MyApp/page/ 是一个完整的 webapp 名称,而不是 MyApp webapp 下的请求名称页面。
我需要在 URL 末尾加上斜杠,否则我会收到错误:“HTTP 状态 405 - 不支持请求方法‘GET’”,这是没问题的,因为我确实不允许对“页面”请求使用 GET 方法。
如果有人知道如何告诉 tomcat,现有 webapp 路径后的尾随斜杠不应该将其重定向到新的 webapp,而是调用整个“字符串”并像在 tomcat6 上一样处理请求,那就太好了!
答案1
这是一个古老的问题,但由于我最近一直在与 Tomcat 8 中的终止斜线作斗争,我知道斜线问题仍然困扰着 Tomcat 用户世界。:-)
您可能会遇到 Tomcat 在加载根上下文时处理重定向的方式发生变化的情况。请查看错误 58660并阅读那里的一些开发人员讨论。您可能需要通过修改中元素mapperContextRootRedirectEnabled
的属性来关闭默认映射器。Context
conf/context.xml
答案2
检查您的欢迎文件列表..以下是推测......
我认为问题的本质是当 Tomcat 出现 / 时 - 它有几个选项 - 遍历欢迎文件列表 - 如果没有任何内容 - 显示目录列表(如果启用)
有趣的事情从这里开始... 许多人希望将 *.do 用于 struts 之类的东西。因此他们希望将 index.do 作为主页。或者常见的是 index.jsp,其中 *.jsp 映射到 JspServlet。
事情开始变得有趣了。假设您的欢迎文件是 index.jsp、index.do。
Tomcat(IIRC)所做的是首先遍历欢迎文件列表以查找该名称的资源。
然后它将进行第二次查找匹配的映射。因此,如果在欢迎列表中指定了 index.jsp 并且映射了 *.jsp。那么 tomcat 将尝试转发到 index.jsp,您将得到 404。
所以我猜你有一个 servlet 映射和欢迎文件重叠。并且该 servlet 的行为不支持 GET。(因此出现 405)
答案3
如果您的项目使用的是 v2.2 的动态 Web 模块,则您需要在 WebContent 中的 web.xml(例如 index.html)中明确创建至少一个文件(可以是空的 html 文件)。