安哥网络 发表于 2012-12-21 13:49:56

urlrewrite实现伪静态化

产生背景 静态网页与动态网页比较: 静态网页: 优点: A 、对搜索引擎友好,被收录的质量高; B 、访问速度快; C 、资源( cpu等)占用少。 缺点: A 、对于大型门户,或者社区来说,不断的修改将会产生大量 I/O ,会导致磁盘出现碎片甚至出现磁盘坏道。相当恐怖一个隐患。用户信息一旦没有了就没戏玩了。 B 、储存空间占用会多一些。 动态网页: 优点:相对于静态,它的劣势也就是动态的优势所在——占用空间少,对硬盘友好。 缺点: A 、对搜索引擎不友好。搜索引擎会不收录带问号的网址 ? 因为搜索引擎怕由于问号而进入死循环。 B 、高并发时资源占用较多。 二、伪静态作用 1 、提高安全性,可以有效的避免一些参数名、 ID 等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个 404 或错误页面,这比直接返回 500 或一大堆服务器错误信息要好的多 2 、美化 URL ,去除了那些比如 *.do 之类的后缀名、长长的参数串等,可以自己组织精简更能反映访问模块内容的 URL 3 、更有利于搜索引擎的收入,通过对 URL 的一些优化,可以使搜索引擎更好的识别与收录网站的信息 三、 Java 伪静态实现方式 Java 上主要使用 urlRewrite ,下载地址 http://www.tuckey.org/urlrewrite/,从单词字面意义上可以发现就是对 URL 进行重写,用户得到的全部都是经过处理后的 URL 地址。其具体实现步骤如下: http://xdwangiflytek.iteye.com/images/smiles/icon_idea.gif1、   下载 urlrewrite 的 jar 包,并复制到项目中去; http://xdwangiflytek.iteye.com/images/smiles/icon_idea.gif2、   在 web.xml 中配置过滤器 Xml代码 http://xdwangiflytek.iteye.com/images/icon_copy.gif http://xdwangiflytek.iteye.com/images/icon_star.pnghttp://xdwangiflytek.iteye.com/images/spinner.gif


[*]<!-- 伪静态过滤器注册 -->      
[*]    <filter>
[*]      <filter-name>UrlRewriteFilter</filter-name>
[*]      <filter-class>
[*]            org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
[*]      </filter-class>
[*]      <init-param>
[*]            <param-name>logLevel</param-name>
[*]            <param-value>WARN</param-value>
[*]      </init-param>
[*]      <!-- 这里配置urlrewrite.xml文件的地址,如果和web.xml同在WEB-INF下则不需配置此项 -->
[*]      <init-param>
[*]            <param-name>confPath</param-name>
[*]            <param-value>/WEB-INF/classes/urlrewrite.xml</param-value>
[*]      </init-param>
[*]    </filter>
[*]    <!-- 伪静态过滤器映射-->   
[*]    <filter-mapping>
[*]      <filter-name>UrlRewriteFilter</filter-name>
[*]      <url-pattern>/*</url-pattern>
[*]    </filter-mapping>

<!-- 伪静态过滤器注册 -->                 <filter>                <filter-name>UrlRewriteFilter</filter-name>                <filter-class>                        org.tuckey.web.filters.urlrewrite.UrlRewriteFilter                </filter-class>                <init-param>                        <param-name>logLevel</param-name>                        <param-value>WARN</param-value>                </init-param>                <!-- 这里配置urlrewrite.xml文件的地址,如果和web.xml同在WEB-INF下则不需配置此项 -->                <init-param>                        <param-name>confPath</param-name>                        <param-value>/WEB-INF/classes/urlrewrite.xml</param-value>                </init-param>        </filter>        <!-- 伪静态过滤器映射-->         <filter-mapping>                <filter-name>UrlRewriteFilter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>
http://xdwangiflytek.iteye.com/images/smiles/icon_idea.gif3 、编写 urlrewrite.xml 伪静态化的规则文件,这个文件我们可以从下载网址上下载下来,然后进行修改,这里以 Struts2 的 Action 跳转为例: Xml代码 http://xdwangiflytek.iteye.com/images/icon_copy.gif http://xdwangiflytek.iteye.com/images/icon_star.pnghttp://xdwangiflytek.iteye.com/images/spinner.gif


[*]<?xml version="1.0" encoding="utf-8"?>
[*]<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN" "http://tuckey.org/res/dtds/urlrewrite3.1.dtd">
[*]<urlrewrite>
[*]   <!-- 1、匹配一个参数的 -->
[*]   <rule>
[*]    <!-- /FileShare/myUpload/myUploadList/pageNo/1.html -->
[*]      <from>^/(*)\/(*)\/(*)_((?:+)|(?:+)).html$</from>
[*]      <to>/$1!$2.action?$3=$4</to>
[*]      <!--   
[*]         <from>^/myUpload/myUploadList/pageNo/((?:+)|(?:+)).html$</from>
[*]         <to>/myUpload!myUploadList.action?pageNo=$1</to>
[*]         -->
[*]    </rule>
[*]      
[*]    <!-- 2、匹配两个参数的 -->
[*]   <rule>
[*]      <from>^/(*)\/(*)\/(*)_((?:+)|(?:+))\/(*)_((?:+)|(?:+)).html$</from>
[*]      <to>/$1!$2.action?$3=$4&amp;$5=$6</to>
[*]    </rule>
[*]      
[*]    <!-- ${applicationScope.basePath }/myUpload!myUploadList.action?pageNo=1 -->
[*]    <!-- 1、匹配一个参数的 -->
[*]    <outbound-rule>
[*]      <from>^/(*)\/(*)!(*).action\?(*)=((?:+)|(?:+))$</from>
[*]      <to>/$1/$2/$3/$4_$5.html</to>
[*]      
[*]      <!--
[*]      <from>^/FileShare/myUpload!myUploadList.action\?pageNo=(+)$</from>
[*]      <to>/FileShare/myUpload/myUploadList/page/$1.html</to>
[*]      -->
[*]    </outbound-rule>
[*]      
[*]    <!-- 2、匹配两个参数的 -->
[*]    <outbound-rule>
[*]      <from>^/(*)\/(*)!(*).action\?(*)=((?:+)|(?:+))&amp;(*)=((?:+)|(?:+))$</from>
[*]      <to>/$1/$2/$3/$4_$5/$6_$7.html</to>
[*]    </outbound-rule>
[*]
[*]</urlrewrite>

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.1//EN" "http://tuckey.org/res/dtds/urlrewrite3.1.dtd"><urlrewrite>   <!-- 1、匹配一个参数的 -->   <rule>    <!-- /FileShare/myUpload/myUploadList/pageNo/1.html -->            <from>^/(*)\/(*)\/(*)_((?:+)|(?:+)).html$</from>                <to>/$1!$2.action?$3=$4</to>                <!--                <from>^/myUpload/myUploadList/pageNo/((?:+)|(?:+)).html$</from>               <to>/myUpload!myUploadList.action?pageNo=$1</to>               -->    </rule>      <!-- 2、匹配两个参数的 -->   <rule>            <from>^/(*)\/(*)\/(*)_((?:+)|(?:+))\/(*)_((?:+)|(?:+)).html$</from>                <to>/$1!$2.action?$3=$4&amp;$5=$6</to>    </rule>      <!-- ${applicationScope.basePath }/myUpload!myUploadList.action?pageNo=1 -->    <!-- 1、匹配一个参数的 -->    <outbound-rule>                <from>^/(*)\/(*)!(*).action\?(*)=((?:+)|(?:+))$</from>                <to>/$1/$2/$3/$4_$5.html</to>                        <!--                <from>^/FileShare/myUpload!myUploadList.action\?pageNo=(+)$</from>                <to>/FileShare/myUpload/myUploadList/page/$1.html</to>          -->        </outbound-rule>                  <!-- 2、匹配两个参数的 -->    <outbound-rule>                <from>^/(*)\/(*)!(*).action\?(*)=((?:+)|(?:+))&amp;(*)=((?:+)|(?:+))$</from>                <to>/$1/$2/$3/$4_$5/$6_$7.html</to>        </outbound-rule></urlrewrite>
说明: http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif1) 、 outbound-rule ,先说这个是因为在开发编写时,一般先写这部分然后再先 rule 的, outbound-rule 是将页面上的超链接选项地址转化为伪静态地址,这里需要注意的是页面中的超链接需要经过response.encodeUrl(url) 转化,或采用 <C:URL> 标签进行转化 ; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif2) 、 outbound-rule 中的 from 表示页面上的地址, to 表示在网页上显示出来的伪静态地址; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif3) 、 outbound-rule 中的 form 和 to 需要加上项目名称,而 rule 不需要的; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif4) 、 rule 处理伪静态地址, form 包含通过正则表达式对请求进行匹配, to 即为实际的请求地址; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif5) 、因为这里用到正则,所以需要注意转义: &=>&amp;   ?=>/? 等 http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif6) 、 $1,$2 代表与你配置正规表达式 /(\w+)/(\w+)/ 相对应的参数。 <to type="forward"> 默认的是 type="forward" 。另一个常用的规则就是连接外部的网站。就要用到。 <to type="redirect"> ; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif7) 、 ^: 匹配字符串的开始, $ :匹配字符串的结束; http://xdwangiflytek.iteye.com/images/smiles/icon_arrow.gif8) 、 (*)\/(*) 中的“ \ ”表示转义; 其实上面的我们可以看出就是在设定一些规则(在编写正则的时候需要细心,编写正则时,可以在 http://www.rubular.com/上进行验证),这和 Rest 风格的编程很类似,设计的规则越好,其展示出来的链接地址越直观,简洁。

http://xdwangiflytek.iteye.com/images/smiles/icon_idea.gif4、   修改 jsp 页面上的地址(需要添加 jstl 相关的 jar : jstl.jar 、 standard.jar ): 一个参数的: Jsp代码 http://xdwangiflytek.iteye.com/images/icon_copy.gif http://xdwangiflytek.iteye.com/images/icon_star.pnghttp://xdwangiflytek.iteye.com/images/spinner.gif


[*]<c:url value="/myUpload!myUploadList.action?pageNo=1" var="myUpload"></c:url>
[*]      <li>
[*]            <a href='${myUpload }' target="main">My Upload</a>
[*]      </li>

        <c:url value="/myUpload!myUploadList.action?pageNo=1" var="myUpload"></c:url>                        <li>                                <a href='${myUpload }' target="main">My Upload</a>                        </li>
两个参数的: Jsp代码 http://xdwangiflytek.iteye.com/images/icon_copy.gif http://xdwangiflytek.iteye.com/images/icon_star.pnghttp://xdwangiflytek.iteye.com/images/spinner.gif


[*]<s:set name="id" value="id"></s:set>   
[*]   <s:set name="pageNo" value="pagination.getPageNo()"></s:set>
[*]   <c:url value='/modifyUpload!entryModify.action?uploadFileId=${id}&pageNo=${pageNo }' var="modifyFileUrl" ></c:url>
[*]<a href='${modifyFileUrl }' target="main" >Edit</a>

                <s:set name="id" value="id"></s:set>             <s:set name="pageNo" value="pagination.getPageNo()"></s:set>          <c:url value='/modifyUpload!entryModify.action?uploadFileId=${id}&pageNo=${pageNo }' var="modifyFileUrl" ></c:url>                <a href='${modifyFileUrl }' target="main" >Edit</a>


[*]jstl.jar (20.2 KB)
[*]下载次数: 2

[*]standard.jar (384 KB)
[*]下载次数: 2

[*]urlrewrite-3.1.0.jar (143.3 KB)
[*]下载次数: 3

本文转载自: http://xdwangiflytek.iteye.com/blog/1591186

页: [1]
查看完整版本: urlrewrite实现伪静态化