urlrewrite(伪静态技术运用2之outbound-rule)

问题:页面通过"/servlet/detail?magid=520&categoryId=205“来访问一个servlet,这个链接在IE地址栏上给人家看起来很不舒服,想把它伪装一下变成别的地址,例如想把它伪装成:/servlet/detail/520_205.html 或者其他的url地址那该怎么实现了?

【注意:页面连接不是“/servlet/detail/520_205.html “而是“/servlet/detail?magid=520&categoryId=205”】

urlrewrite.xml配置:

错误代码:

<urlrewrite>

<rule>
<from>/servlet/detail/([0-9]+)_([0-9]+).html</from>
<to>/servlet/detail?magid=$1&amp;categoryId=$2</to>
</rule>

</urlrewrite>

有很多新手刚开始就认为这样配置就能解决了上面提问的问题。其实错误,这样页面只能通过:”/servelt/detail/24_42.html ” 来访问,访问这个地址时它会forward到/servlet/detail?magid=24&categoryid=42这个servlet。如果我们页面通过“/servlet/detail?magid=24&categoryid=42”这样来访问的话,是不会被重写的。这是新手的常遇到的一个问题。

正确代码:

<urlrewrite>

<rule>
<from>/servelt/detail/([0-9]+)_([0-9]+).html</from>
<to>/servelt/detail?magid=$1&amp;categoryId=$2</to>
</rule>


<outbound-rule>
<from>/servlet/detail\?magid=([0-9]+)&amp;categoryId=([0-9]+)</from>
<to>/servlet/detail/$1_$2.html</to>
</outbound-rule>
</urlrewrite>

通过上面的配置基本上实现了上面的提出的问题。

1:通过:“/servlet/detail?magid=24&categoryid=42”来访问,得在<outbound-rule>标签中配置,同时还得在<rule>中配置相关信息。如果rule中没有配置,会找不到相关的资源信息,抱404错误

2:上面的配置文件得注意的地方:在<outbound-rule>中的特殊符号“?”“&”等得转义。不然的话也会出错,不能被重写。像上面的“outbound-rule>from标签中路径中如果出现“?”问号的话,记得要转义,“\?”。

3:jsp中,上面提出的问题中,在页面如果直接写<a href="/servlet/detail?magid=24&categoryid=42"/>这样也是错误的,同样也没办法被重写。

它只能用在response.encodeURL()或者jstl中c:url中,才会被重写。这个也是容易犯错的地方。

jsp:页面关键代码:

<a href="<c:url value='/servlet/detail?magid=3934&categoryId=3'/>">JSTl c:URL</a><hr/>
<a href="<%=response.encodeUrl("/servlet/detail?magid=3934&categoryId=3") %>">response EncodeURL</a>

4:如果想在<outbound-rule>中定义多个from to标签这个是不可以的,<outbound-rule>中只能定义一个from to 标签。这个是我在程序中测试得出来的结论。只能定义一对from to标签是在个人测试得出来的结论,如果您测试出来不是这样的话,请给我指正,评判。

5:通过上面的urlrewrite.xml的配置, <a href=”servlet/detail?44_77.html">测试</a>这样子来访问也是可以被重写的。也就是相当于双向。


这样便很好的隐藏了真实地址
这其中有点是需要注意的,引用官网中的一段话:
Using the example above JSP's with the code
<a href="<%= response.encodeURL("/world.jsp?country=usa&amp;city=nyc") %>">nyc</a>
will output
<a href="/world/usa/nyc">nyc</a>

Or JSTL
<a href="<c:url value="/world.jsp?country=${country}&amp;city=${city}" />">nyc</a>
will output
<a href="/world/usa/nyc">nyc</a>

需要转化的链接不能直接写在a标签中,需要写在c:url或其他服务器需要解析的变量中,这样才能对其重新显示

注意:<rule>标签可以单独的存在。而<outbound-rule>必须要和<rule>标签成对出现。而且在页面的时候需要<c:url>标签来转换成<rule>所对应的规则。

转自:http://hi.baidu.com/allen_zzw/item/e2d16a539fdf41a2acc857b2

你可能感兴趣的:(urlrewrite)