我已部署example.war到Tomcat 6.0.32(在撰写本文时为最新),并且已部署的webapp包含以下内容:
example.war
$ 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/
/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不起作用。
/example/item
star.html
我缺少一些特殊的配置吗?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
有人回答了这个问题,但问题的措词却大不相同,这就是为什么我要按原样保留自己的问题(对于那些使用不同搜索词的用户):
简而言之,请参阅此类:
http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_26/java/org/apache/tomcat/util/http/mapper/Mapper.java
根据一位开发人员的评论,在可预见的情况下,它将在Tomcat中保持不变。
该行为未在任何地方指定,但其想法是,在物理文件夹或上下文的根的情况下,后缀“ /”无关。由于这会导致反复出现的路径解析问题(不必要地使像我们的默认servlet这样的servlet变得更加复杂),因此,在所有情况下,我们总是向servlet提供训练“ /”。这也是最有效的,因此这是当前使用的实现。 我很遗憾这会阻止您使用Tomcat,但是在这里我没有什么改变。
该行为未在任何地方指定,但其想法是,在物理文件夹或上下文的根的情况下,后缀“ /”无关。由于这会导致反复出现的路径解析问题(不必要地使像我们的默认servlet这样的servlet变得更加复杂),因此,在所有情况下,我们总是向servlet提供训练“ /”。这也是最有效的,因此这是当前使用的实现。
我很遗憾这会阻止您使用Tomcat,但是在这里我没有什么改变。