我将example.war
部署到Tomcat 6.0.32(编写本文时),部署的webapp包含以下内容:
$ find example | egrep -v "WEB-INF/lib|WEB-INF/classes"
example
example/_items.html
example/_share_link.html
example/all_items.html
example/images
example/images/ajax-loader.gif
example/index.html
example/item
example/item/star.html
example/item.html
example/js
example/js/c-jquery-1.4.2.js
example/js/c-jquery-ui-1.8.2.js
example/js/jquery-1.4.2.js
example/js/jquery-1.4.4.min.js
example/js/jquery-ui-1.8.2.js
example/js/jquery-ui-1.8.8.custom.min.js
example/js/jquery.blockUI.js
example/META-INF
example/META-INF/MANIFEST.MF
example/search.html
example/static
example/static/index.html
example/templates-hidden
example/templates-hidden/default.html
example/templates-hidden/wizard-all.html
example/WEB-INF
example/WEB-INF/web.xml
特别注意:
example/item
example/item/star.html
example/item.html
我尝试申请上述资源:
$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /example/item HTTP/1.0
HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
Location: http://localhost:8080/example/item/
Date: Thu, 07 Apr 2011 08:24:39 GMT
Connection: close
Connection closed by foreign host.
服务器告诉我尝试/example/item/
$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /example/item/ HTTP/1.0
HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=6D97AD3A8F77697146163946B1BBBB64; Path=/example
Expires: Thu, 7 Apr 2011 08:24:58 UTC
Cache-Control: no-cache, private, no-store
Pragma: no-cache
Date: Thu, 07 Apr 2011 08:24:58 GMT
X-Lift-Version: 2.3
Content-Type: text/html;charset=utf-8
Content-Length: 106
Connection: close
<!DOCTYPE html>
<html> <body>The Requested URL /example/item/ was not found on this server</body> </html>
Connection closed by foreign host.
这不是我所期望的。对/example/item
的第一个请求(没有尾部斜杠)应该有效 - 此时,Lift Web框架将star.html
作为模板接管并呈现我的项目。这适用于Jetty 6.1.22和Resin 4.0.16,但不适用于Tomcat。
我缺少一些特殊的配置吗?在这种情况下,servlet规范中是否存在表示正确行为的内容?
我在这里可以找到我使用的示例代码: https://github.com/dpp/simply_lift/tree/master/samples/shopwithme
我在这里提出了原始问题: https://groups.google.com/forum/?fromgroups#!topic/liftweb/7QlFud1ieOU
注意这个问题不是关于Lift或它的渲染管道 - 它是关于Tomcat的,以及它的行为与Jetty和Resin的不同之处。
更新:这是典型的“尾随斜线”问题,此处提交了错误报告:https://issues.apache.org/bugzilla/show_bug.cgi?id=32424
答案 0 :(得分:2)
有人回答了这个问题,但问题的措辞完全不同,这就是为什么我要按原样留下我自己的问题(对于使用不同搜索字词的用户):
Where does Tomcat append / to directory paths?
简而言之,请参阅此课程:
...然后在该类中找到详细说明“默认servlet”的评论 - 它被称为“规则7”,据许多人说,这是一个错误:https://issues.apache.org/bugzilla/show_bug.cgi?id=32424
根据其中一位开发者的评论,在可预见的情况下,它将在Tomcat中保持不变:
未指定行为 在任何地方,但想法是在 物理文件夹或根的情况 在上下文中,尾随'/'不是 相关。由于这会导致反复发作 路径解析问题(由此产生 像我们的默认servlet一样的servlet 我们总是在不必要地复杂化 通过培训呈现servlet '/' 在所有情况下。它也是最多的 高效,这就是了 目前的实施 使用
我很遗憾会阻止你 使用Tomcat,但没有任何东西 我会在这里改变。