我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > urlrewrite实现伪静态化
总共48086条微博

动态微博

查看: 1433|回复: 0

urlrewrite实现伪静态化

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-07-16 19:55:47 |只看该作者 |倒序浏览
产生背景
静态网页与动态网页比较:
静态网页:
优点: 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 地址。其具体实现步骤如下:
1、 下载 urlrewrite 的 jar 包,并复制到项目中去;
2、 在 web.xml 中配置过滤器
Xml代码  [url=][/url]
<!-- 伪静态过滤器注册 -->      
    <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>  
3 、编写 urlrewrite.xml 伪静态化的规则文件,这个文件我们可以从下载网址上下载下来,然后进行修改,这里以 struts2 的 Action 跳转为例:
Xml代码  [url=][/url]
<?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>^/([a-zA-Z]*)\/([a-zA-Z]*)\/([a-zA-Z]*)_((?:[a-zA-Z]+)|(?:[0-9]+)).html$</from>  
        <to>/$1!$2.action?$3=$4</to>  
        <!--   
         <from>^/myUpload/myUploadList/pageNo/((?:[a-zA-Z]+)|(?:[0-9]+)).html$</from>  
         <to>/myUpload!myUploadList.action?pageNo=$1</to>  
         -->  
    </rule>  
    <!-- 2、匹配两个参数的 -->  
     <rule>  
        <from>^/([a-zA-Z]*)\/([a-zA-Z]*)\/([a-zA-Z]*)_((?:[a-zA-Z]+)|(?:[0-9]+))\/([a-zA-Z]*)_((?:[a-zA-Z]+)|(?:[0-9]+)).html$</from>  
        <to>/$1!$2.action?$3=$4&$5=$6</to>  
    </rule>  
    <!-- ${applicationScope.basePath }/myUpload!myUploadList.action?pageNo=1 -->  
    <!-- 1、匹配一个参数的 -->  
    <outbound-rule>  
        <from>^/([a-zA-Z]*)\/([a-zA-Z]*)!([a-zA-Z]*).action\?([a-zA-Z]*)=((?:[a-zA-Z]+)|(?:[0-9]+))$</from>  
        <to>/$1/$2/$3/$4_$5.html</to>  
        <!--  
        <from>^/FileShare/myUpload!myUploadList.action\?pageNo=([0-9]+)$</from>  
        <to>/FileShare/myUpload/myUploadList/page/$1.html</to>  
        -->  
    </outbound-rule>  
    <!-- 2、匹配两个参数的 -->  
    <outbound-rule>  
        <from>^/([a-zA-Z]*)\/([a-zA-Z]*)!([a-zA-Z]*).action\?([a-zA-Z]*)=((?:[a-zA-Z]+)|(?:[0-9]+))&([a-zA-Z]*)=((?:[a-zA-Z]+)|(?:[0-9]+))$</from>  
        <to>/$1/$2/$3/$4_$5/$6_$7.html</to>  
    </outbound-rule>  
</urlrewrite>  
说明:
1) 、 outbound-rule ,先说这个是因为在开发编写时,一般先写这部分然后再先 rule 的, outbound-rule 是将页面上的超链接选项地址转化为伪静态地址,这里需要注意的是页面中的超链接需要经过response.encodeUrl(url) 转化,或采用 <C:URL> 标签进行转化 ;
2) 、 outbound-rule 中的 from 表示页面上的地址, to 表示在网页上显示出来的伪静态地址;
3) 、 outbound-rule 中的 form 和 to 需要加上项目名称,而 rule 不需要的;
4) 、 rule 处理伪静态地址, form 包含通过正则表达式对请求进行匹配, to 即为实际的请求地址;
5) 、因为这里用到正则,所以需要注意转义: &=>& ?=>/? 等
6) 、 $1,$2 代表与你配置正规表达式 /(\w+)/(\w+)/ 相对应的参数。 <to type="forward"> 默认的是type="forward" 。另一个常用的规则就是连接外部的网站。就要用到。 <to type="redirect"> ;
7) 、 ^: 匹配字符串的开始, $ :匹配字符串的结束;
8) 、 ([a-zA-Z]*)\/([a-zA-Z]*) 中的“ \ ”表示转义;
其实上面的我们可以看出就是在设定一些规则(在编写正则的时候需要细心,编写正则时,可以在http://www.rubular.com/ 上进行验证),这和 Rest 风格的编程很类似,设计的规则越好,其展示出来的链接地址越直观,简洁。
4、 修改 jsp 页面上的地址(需要添加 jstl 相关的 jar : jstl.jar 、 standard.jar ):
一个参数的:
Jsp代码  [url=][/url]
<c:url value="/myUpload!myUploadList.action?pageNo=1" var="myUpload"></c:url>  
        <li>  
            <a href='${myUpload }' target="main">My Upload</a>  
        </li>  
两个参数的:
Jsp代码  [url=][/url]
<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>  

. f* p& E& i) u6 W! p

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

周末了 哈哈
快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表