SEO优化-伪静态-URLRewrite 详解

UrlRewrite

UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址,类似于Apachemod_rewrite。将我们的动态网页地址转化为静态的地址,如htmlshtml,还可以隐藏网页的真正路径,

比如:有时候需要将xxx.com/news/ type1/001.jsp 转化成显示路径为xxx.com/news_type1_001.html

有点如下:

一:提高安全性,屏蔽内部的url结构.

二:美化URL

三:更有利于搜索引擎的收入,通过对URL的一些优化,可以使搜索引擎更好的识别与收录网站的信息.


下载地址:

官网下载: http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/4.0/index.html#filterparams

1. 创建web项目,增加 urlrewritefilter-4.0.3.jar 到 WEB-INF/lib 

2. 在WEB-INF/web.xml 增加urlrewritefilter过滤器 (near the top above any servlet mappings)


web.xml中的配置。


	<!--配置Url Rewrite的Filter -->
	<filter>
		<filter-name>UrlRewriteFilter</filter-name>
		<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
	</filter>
	<!--配置Url Rewrite的Filter拦截所有请求 -->
	<filter-mapping>
		<filter-name>UrlRewriteFilter</filter-name>
		<url-pattern> /* </url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
	</filter-mapping>

如果觉得/*这样的通配,并不符合我的预期,我只想对部分路径进行URL的重写,/*可能会造成我想象不到的或者是许微不足道的性能浪费.我把它改成了我需要的:


 <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/member/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/article/*</url-pattern>
    </filter-mapping>



3. 因为上面我们通过confPath定义了配置文件的路径,其实该默认位置就是在/WEB-INF/urlrewrite.xml,为了更能说明问题,所以显示指定下

此时我们就可以通过url进行模拟了.

注意:

1.urlrewrite.xmlutf-8.所以如果你要在rule上加note标签为中文的话,也一定是要utf-8.

2.UrlRewriteFilter 最好是配置在web.xml的前面filter,不然有可能对有些url转变失去作用.

3.urlrewrite属性:有仅只有一个,rule属性::至少一个.

4.在写rule的时,如果有多个参数时,中间的连接符号&应该是&

5.ruleurl重写规则,from是显示出来的地址,to是映射的实际地址,$1是重写参数,它的值与from中的正则表达式是一一对应,可以为多个,()里是匹配的正则表达式在正则表达式^指定字符的串开始,$为指定结束

6.对于中文参数要使用(.*)作为参数转义.



urlrewrite.xml


<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" 
        "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite>
	<!-- Downloads* -->
	<rule>
	<!-- wenti  wen  -->
		<from>/manuals_/download-([\w-]+)$</from>
		<to type="redirect">%{context-path}/download?slug=$1</to>
	</rule>	
	<!-- Post -->
	<rule>
		<from>/manuals/([\w-]+$)</from>
		<to type="redirect">%{context-path}/post?slug=$1</to>
	</rule>
	
	<!-- All brands -->
	<rule>
		<from>/all-brands$</from>
		<to type="redirect">%{context-path}/brandlist</to>
	</rule>
	
	<!-- Brand -->
	<rule>
		<from>/brands/free-([\w-]+)-manuals$</from>
<!-- 		<from>/brands/free-manuals$</from> -->
		<to type="redirect">%{context-path}/brand?slug=$1</to>
	</rule>
	
	<!-- Category* -->
	<rule>
		<from>/category/([\w-]+)/free-([\w-]+)-manuals$</from>
		<to type="redirect">%{context-path}/brandAll?brand=$1<span style="color:#FF0000;">&amp;</span>cat_slug=$2</to>
	</rule>
	<!-- Search* -->
	<rule>
		<from>/search_q=([\w-]+)</from>
		<to type="redirect">%{context-path}/brandsearch3?q=$1</to>
	</rule>


	
</urlrewrite>

在调试的时候可以用
<span style="color:#FF0000;"><to type="redirect"</span>
 上线之后就要用forward

如果多个参数要把&写成html识别的字符&amp;


之前如果在web.xml中设置<dispatcher>的话,则一直都不能forward都对应的action中去。以上 在地址栏中输入 http://lacalhost:8080/应用名/test.dhtml 就可以映射到test.action中。如果要映射test!save.action可以写成 test/save.dhtml就可以了。

看 test-access.jsp的代码(这里,我用了Convention的零配置,所以test-access.jsp在 WEB-INF/content目录中)

<s:form action="test/save.dhtml" method="POST">

<s:textfield name="msg" label="输入信息"/>

<s:token name="token"/>

<s:submit value="确定" />

</s:form>

这里加入了 token令牌,主要是防止表单重复提交的。

那么,我们可以将在@Result中的错误页面也可以写成html的形式了,因为在上面配置了。

<rule>

<from>^/content/([a-zA-Z]+.*).html</from>

<to type="forward">/WEB-INF/content/$1.jsp</to>

</rule>

将所有的html转换成.jsp来处理。

那么,在@Result中 我们就可以这样写:

@Result(name="invalid.token",location="/content/error.html",type="redirect")})

在重复提交的情况下,URL会转向到/WEB-INF/content/error.jsp中。

但是上述<s:form action="test/save.dhtml" method="POST">并不是一种好的方式。它在一定程度上依赖了UrlRewrite。我们希望,在<s:form/>中依然写test!save.action 但是在页面中显示的是test/save.dhtml。那么我们可以用<outBund-rule/>标签。

此标签的原理是,页面通过UrlRewrite过滤器后,这个过滤器会遍历这个页面,用设定的正则来替换页面中的URL。如:

<outbound-rule>

<from>/test!save.action</from>

<to type="redirect">/test/save.dhtml</to>

</outbound-rule>

注意:在uoutbound-rule的<from>标签里面如果出现“?”号,要把它转义,转义后是: “/?“,不然会出现404找不到错误。

这样,在jsp中写的<s:form action=”test!save.action”> 而通过编译后在客户端中的源码就可以看到:<form id="test" name="test" action="/strutsTest/test/save.dhtml" method="POST">

到此,还是不能进行映射,我们还要进行对test/save.dhtml进行<role/>映射。

<rule>

<from>^/test/save.dhtml</from>

<to type="forward">test!save.action</to>

</rule>

总结:UrlRewrite这种方式虽好,但是他在每次匹配一个页面的时候都会遍历urlrewrite.xml中的所有<role/> 所以,在用的时候,应该注意,尽量将<role/>的个数做到越少。那就需要尽量写出更通用的正则表达式。尽量让代码规范性。这也是高质量代码的要求。

简单的介绍一下常用的正规表示式:
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

常用的&要用 &amp;来表示。$1,$2代表与你配置正规表达式>/(\w+)/(\w+)/相对应的参数。<to type="forward">默认的是 type="forward".

 

1.  转向HTML页面的url配置规则:

a)   没有参数:loginAction是对应转向的Action,login是Action里面执行的方法,Action和方法名之间用下划线连接,$1是Acton名字;$2是方法名。例如:http://localhost:8080/struts2/loginAction_login.html

<rule>

     <from>^/([a-zA-Z]+?)_([a-zA-Z]+?)\.html$</from>

     <to type="forward">/$1!$2.do</to>

</rule>

b)   一个参数:33是要传递的参数,同样Action和方法名以及参数之间的连接都是使用下划线,例如:http://localhost:8080/struts2/loginAction_login_33.html

<rule>
<from>
  
^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$
</from>

        <to type="forward">/$1!$2.do?id=$3</to>
</rule>

c)   多个参数:33,ydf和2012-03-31都是参数,例如http://localhost:8080/struts/login_more_33_ydf_2012-03-31.html

<rule>
<from> 
^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$

</from>

   <to type="forward">

/$1!$2.do?id=$3&amp;name=$4&amp;date=$5

</to>
</rule>

 

注意:

1.       uoutbound-rule<from>标签里面如果出现号,要把它转义,转义后是: “/,不然会出现404找不到错误。

2.       如果是多参数配置在url参数拼接时注意&符号的转义:如<to type="forward">/$1!$2.do?id=$3&amp;name=$4&amp;date=$5</to>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值