Part 1: 用途(我本身总结下,起码有如下这2个用途)php
用途1: 隐藏你的具体技术实现html
好比你发布站点时候,若是写的 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 ,那么谁能知道你内部用什么技术语言实现的呢?web
用途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里面定义映射规则。(外网访问地址->内部地址)jsp
你们都知道,当服务器解析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: 参考资料
能够网上搜下关于 “伪”静态,站点优化,搜索引擎优化的相关知识就明白了。