Part 1: 用途(我自己总结下,起码有以下这2个用途)
用途1: 隐藏你的具体技术实现
比如你发布站点时候,如果写的 http://host.com/page1.jsp?a=3&b=8 ,别人一看就知道你用的jsp实现,或者你用的 http://host2.com/page2.php,人家一看就知道你用的php的实现,但是如果你用URL重写让对外暴露的url为 http://host.com/page1_3_8.html ,那么谁能知道你内部用什么技术语言实现的呢?
用途2:站点优化,尤其搜索引擎优化,不带参数的地址更容易被网络爬虫搜索到。
比如 http://host.com/page1_3_8.html 就比 http://host.com/page1.jsp?a=3&b=8 更容易被网络爬虫搜索到,也容易被百度,google, bing 搜到
Part2 : 我们如何让这个目的变成现实呢?
方法是,在web.xml中定义一个过滤器,然后过滤器里面会加载WEB-INF/urlrewrite.xml ,然后再urlrewrite.xml里面定义映射规则。(外网访问地址->内部地址)
大家都知道,当服务器解析web.xml时,会按照以下顺序:context-param -> listener -> filter -> servlet ,所以过滤器是在servlet之前解析出的,也就是在所有页面以及充当控制器的servlet实例化之前就有了。
然后我们解读UrlRewriteFilter类(因为Filter用于拦截请求,所以在请求发送到具体页面之前已经被过滤了,也就是被这些映射规则所适用过了)
可以看出,在载入UrlRewriter时候,会去读confPath所代表的重写映射文件,而这个重写映射文件confPath定义为
也就是要么指定一个,否则就是取拿DEFAULT_MOD_REWRITE_STYLE_CONF_PATH,如果拿不到就拿DEFAULT_WEB_CONF_PATH。
- public static final String DEFAULT_MOD_REWRITE_STYLE_CONF_PATH = "/WEB-INF/.htaccess";
- public static final String DEFAULT_WEB_CONF_PATH = "/WEB-INF/urlrewrite.xml";
所以,我们Canton例子中,最终就会读/WEB-INF/urlrewrite.xml里面定义的各种重写映射规则。
Part 3:深入解读映射文件 urlrewrite.xml
所有的重写规则都定义在urlrewrite.xml,而且每个规则都对应 一个rule 元素,每个rule元素应该有这样的结构
<rule>
<from> 用正则表达式写出的外网访问地址,一般用html后缀来屏蔽具体技术实现细节</from>
<to>用位置参数给出的内网页面url,可以变为你的内部实现,比如jsp页面就用.jsp扩展名</to>
</rule>
例如
- <rule>
- <from>^/(\d+)/(\d+)/page_(\d+)\.html$</from>
- <to>/$1.jsp?category=$2&page=$3</to>
- </rule>
这个例子中,我们可以看到,from 是^/(\w+)/(\w+)/page_(\d+)\.html$ ,这是一个正则表达式,^,$是首尾界定符,所以它表示,访问一个
/一个或多个数字(位置1)/一个或多个数字(位置2)/page_一个或多个数字(位置3).html 的请求,把他映射到什么内部请求呢?
第一个位置的数字放$1,第二个数字的位置放$2,第三个数字的位置放$3 。 【 & 是 &的转义字符】
所以,加入某个请求是 http://host.com/22/33/page_444.html ,则不难发现,第一个位置参数值为22,第二个位置参数值为33,第三个位置参数值为444
所以,系统将其转为内部的 http://host.com/22.jsp?category=33&page=444
Part 4: 参考资料
可以网上搜下关于 “伪”静态,站点优化,搜索引擎优化的相关知识就明白了。