UrlRewriter
伪静态技术运用
通常我们为了更好的缓解服务器压力,和增强搜索引擎的友好面,都将文章内容生成静态页面。
但是有时为了能实时的显示一些信息,或者还想运用动态脚本解决一些问题,不能用静态的方式来展示网站内容,必须用到动态页面显示。
这样以来,就损失了对搜索引擎的友好面,怎么样在两者之间找个中间方法呢,
如何增强你网站中地址的可读性和让搜索引擎快速的收录到你的站点?
这就需要你美化你的网页的地址,
这就产生了伪静态技术
,也就是我们常说的
Url Rewriter
重写技术
。就是当我们访问一个页面时,地址栏中展示出来的是以“.html”为结尾的静态页面形式,而实际上我们访问的动态网页。这里就需要用到
UrlRewriter
技术
。
大家熟悉的可能有很多服务器都提供
Url
重写的技术,以前我们用的最多的就是
Apache
,
Jboss
这样一些服务器自带的一些
Url
重写,但是他们的配置比较麻烦,性能又不是太好。现在我们有专一的开源框架来完成
Url
重写任务,今天我要介绍的就是
UrlRewriteFilter
,它使用起来比较简单。
UrlRewriteFilter
是一个用于改写
URL
的
Web
过滤器,类似于
Apache
的
mod_rewrite
。适用于任何
Web
应用服务器(如
Resin
,
Orion
,
Tomcat
等)。其典型应用就把动态
URL
静态化,便于搜索引擎爬虫抓取你的动态网页。
我们先简单的了解一下使用
Url
重写能给你网站带来哪些好处。
第一:有利于搜索引擎的抓取,因为现在大部分的搜索引擎对动态页面的抓取还比较弱,它们更喜欢抓取一些静态的页面。而我们现在的页面大部分的数据都是动态的显示的。这就需要我们把动态页面变成静态的页面,有利于搜索引擎的抓取。
第二:让用户更容易理解,很少有用户去关心你网站的页面的地址,但对一般的大中型网站增强可读性还是必须的。这样会让你的网站更加完美。
第三:隐藏技术的实现,我们可以通过
Url
重写可以实现技术的隐藏。不至于暴露你所采用的技术,给一些想攻击你网站的爱好者提供方便。
第四:可以很方便的重用,提高网站的移植性。如果我们后台方法改动的话,可以保证前台的页面部分不用改。这样就提高了网站的移植性。
它虽然有这么多的优点,但是也有一点缺点的,因为它是通过过滤器原理来实现的,就以为着又多了一道访问,会多少影响点访问速度的,这个可以忽略不计的。
现在
UrlRewriter
技术有两个技术平台的,一个就是在
Java
方向的,另一个就是
.NET
方向的。今天我们讲的是
Java
方向的应用。
首先让我们了解它的工作原理,说白了它就是一个简单的过滤器(
Filter
)
,看看源码你就会很快的明白,它就是通过我们在
jsp
中常用的两个方法实现的
forward(),sendRedirect()
。
下面我们就
Url
重写技术进行简单应用:
第一步:下载
urlrewrite-3.2.0beta.jar
包,并把
urlrewrite-3.2.0beta.jar
拷到
classpath
下。
第二步:在
WEB-INF
目录下建一个
urlrewrite.xml
配置文件。
第三步:在
web.xml
配置文件中初始化配置
UrlRewriteFilter
。在配置文件中加上下面的代码:
<!--
在设置
URL Rewrite-->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
最后我要简单的讲一下常用的两个配置规则,以下就是简单的
urlrewrite.xml
配置片段。不要习惯
Java
的命名法把它写成
urlRewrite.xml
,这样即使你加上
<init-param>
<param-name>confPath</param-name>
<param-value>/WEB-INF/urlRewrite.xml</param-value>
</init-param>
在启动的服务器的时候还是会报错的,因为源码中必须是全小写的(
urlrewrite.xml
)且只能放到
WEB-INF
下面。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<!--
显示主题帖
-->
<rule>
<from>^/forum/thread/([0-9]+).html$</from>
<to type="forward">/forum/list.action?id=$1</to>
</rule>
<rule>
<from>^/forum/thread/([0-9]+).html?page=([0-9]+)$</from>
<to type="forward">/forum/list.action?id=$1&page=$2</to>
</rule>
</urlrewrite>
所有的规则配置都写在这里。第一个常用个规则就是站内的简单重写。
<rule>
<from></from>
<to type="forward></to>
</rule>
<from></from>
写上你自己定义的访问地址,通常采用正则表达式的写法;
<to type="forward></to>
就是实际的访问地址。比如我们实际的访问地址是:
http://www.phome.asia/forum/list.action?id=16931&page=2
而我们想把它重写为
http://www.phome.asia/forum/thread/16931.html?page=2
。这样看起来比我们实际的要好看的多。我们就应该这样的写:
<rule>
<from>^/forum/thread/([0-9]+).html?page=([0-9]+)$</from>
<to type="forward">/forum/list.action?id=$1&page=$2</to>
</rule>
简单的介绍一下常用的正规表示式:
代码
说明
.
匹配除换行符以外的任意字符
/w
匹配字母或数字或下划线或汉字
/s
匹配任意的空白符
/d
匹配数字
/b
匹配单词的开始或结束
^
匹配字符串的开始
$
匹配字符串的结束
常用的
&
要用
&
来表示。
$1,$2
代表与你配置正规表达式
>/(/w+)/(/w+)/
相对应的参数。
<to type="forward">
默认的是
type="forward"
。
另一个常用的规则就是连接外部的网站。就要用到
<to type="redirect">
。
<rule>
<from>^/rss/yahoo/.html$</from>
<to type="redirect"> http://add.my.yahoo.com/rss? url= http://feed.feedsky.com/ MySiteFeed
</to>
</rule>
常用的也就这两种方式(
forward
,
redirect
)。
以上是基本的用发,但是在配置中一定要注意相关的问题。
本例中一个项目中要实现前台http://localhost:7001/program/web/index.action
顺带如果可能的话,转化strut2中的.action 为.htm
为什么要怎样,说起来很郁闷,客户要求少打几个字,呵呵
本例为ssh结合框架 ,web.xml配置如下
1.在配置的时候一定要注意
第一:字符过滤器
第二:UrlRewriteFilter
第三:struts2过滤器
第四:自定义过滤器
第五:spring配置
的顺序,不然顺序不对会导致一些异常
2 在struts的mapping中一定要加入3种区域的定位
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE </dispatcher>
</filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE </dispatcher>
</filter-mapping>
3 urlrewrite.xml写法
注意的,在from 中一点要有开始符和结束符
type选择一定要多,重定向用redirect 转发用forward,forward可以带参数传值
.action改法类同,但是因为系统较大用到namespace较多,又非客户要求,所以后来就没有配置上去。
4,关于css和图片无法显示的问题。
一定要用绝对路径,不可以用../image/ice.jpg这种模式
最后关于在定义from的时候最好不要和struts2 中定义的namespace重了,有可能导致namespace下找不到XXaction的问题,还有就是引入外包插件的时候,也会因为关键结构给urlrewrite导致不能用。
典型的我们公司后来引入了webediter商用版本,用了url重命名基本上这个插件不能用,所以在引入一些固定结构插件的不建议用urlrewrite.