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

 

  1. public static final String DEFAULT_MOD_REWRITE_STYLE_CONF_PATH = "/WEB-INF/.htaccess"
  2.  
  3. public static final String DEFAULT_WEB_CONF_PATH = "/WEB-INF/urlrewrite.xml"
  4.  
  5.   

所以,我们Canton例子中,最终就会读/WEB-INF/urlrewrite.xml里面定义的各种重写映射规则。

 

 

Part 3:深入解读映射文件 urlrewrite.xml

 

所有的重写规则都定义在urlrewrite.xml,而且每个规则都对应 一个rule 元素,每个rule元素应该有这样的结构

 

<rule>
<from>  用正则表达式写出的外网访问地址,一般用html后缀来屏蔽具体技术实现细节</from>
<to>用位置参数给出的内网页面url,可以变为你的内部实现,比如jsp页面就用.jsp扩展名</to>
</rule>

 

例如

 

  1. <rule> 
  2. <from>^/(\d+)/(\d+)/page_(\d+)\.html$</from> 
  3. <to>/$1.jsp?category=$2&amp;page=$3</to> 
  4. </rule> 
  5.  
  6.   

这个例子中,我们可以看到,from ^/(\w+)/(\w+)/page_(\d+)\.html$ ,这是一个正则表达式,^,$是首尾界定符,所以它表示,访问一个

/一个或多个数字(位置1/一个或多个数字(位置2/page_一个或多个数字(位置3.html 的请求,把他映射到什么内部请求呢?

第一个位置的数字放$1,第二个数字的位置放$2,第三个数字的位置放$3   &amp; &的转义字符】

 

所以,加入某个请求是  http://host.com/22/33/page_444.html  ,则不难发现,第一个位置参数值为22,第二个位置参数值为33,第三个位置参数值为444

所以,系统将其转为内部的 http://host.com/22.jsp?category=33&page=444

 

 

Part 4: 参考资料

 

可以网上搜下关于 静态,站点优化,搜索引擎优化的相关知识就明白了。