最近面试被问到问题:用jsp做的网站网页的后缀都有.jsp的后缀,有没有什么办法能够消除掉这个后缀。回来研究了发现用urlrewrite可以达到目的。
这个是适用于java web application的urlrewrite的网站,网站上写的相当清楚了。我就对应于消除掉.jsp后缀这个特定的任务记录一下。
该网站给出了urlrewrite.xml的示例配置。http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/urlrewrite.xml其中可以看到,最简单的urlrewrite就是
<rule> <from>/some/old/page.html</from> <to>/very/new/page.html</to> </rule>
from标签内就是浏览器请求的url,to就是发给容器的url。
根据官方给出的文档http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html
<from> element
You must always have exactly one from for each rule or outbound-rule. Value can be a regular expression in the Perl5 style. Note, from url's are relative to the context.
<to> element
Value can be a regular replacement expression in the Perl5 style.
这里能够使用正则表达式来指定特定的url。那么最先想到的方法就是
<rule>
<from>/(.*)</from>
<to>/$1.jsp</to>
</rule>
这样能够把根目录上所有的文件都添加上.jsp的后缀。但是运行却是后台不停报错。修改为
<rule>
<from>/(.*)</from>
<to type="redirect">%{context-path}/$1.jsp</to></rule>
发现浏览器报错:
此网页包含重定向循环
浏览器的地址栏url后缀为.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp.jsp,既是不停地给url添加.jsp后缀。这里的原因就是因为对于.*,以.jsp结尾的url也符合。所以以.jsp结尾的url也会被添加.jsp后缀。导致死循环不停添加。forward方式(<to>元素的默认方式)服务器端不停报错也是因为不停地服务器端跳转的原因。那么只要<from>里的正则表达式修改为不以jsp结尾的就行。
<rule>
<from>/((?!(.*?jsp$)).*)</from>
<to>/$1.jsp</to>
</rule>
ok.