使用Url Rewrite进行URL重写(实现网站伪静态)

有些项目需要隐藏请求地址的后缀,比如Struts的请求地址通常写成xxxx.action\xxxx.do结尾,现在想把。action\.do去掉,改为.html或其他(login.action ---> login.html同样可以进行数据请求,实际上还是调用原来的地址

为什么要用URL重写:

主要原因是为了搜索引擎更容易找到,大部分搜索引擎都优先考虑收录静态的HTML页面,而不是动态的*.jsp、*.php页面,但实际上绝大部分网站都是动态的,不可能全部是静态的HTML页面,因此互联网上的大部分网站都会考虑使用伪静态——就是将*.jsp*.php这种动态URL伪装成静态的HTML页面。

步骤1:下载Url Rewrite Filter 3.2.0 (官网:http://tuckey.org/urlrewrite/

步骤2:拷贝jar文件

解压urlrewrite-3.2.0-src.rar,(如果是单独的测试工程,则需要拷贝urlrewrite-3.2.0-src/lib下的所有依赖的jar包),拷贝urlrewrite-3.2.0-src\webapp\WEB-INF\lib里的urlrewrite-3.2.0.jar到你的Web工程的WEB-INF\lib目录下

步骤3:配置web.xml 文件

在web.xml文件中添加如下配置代码:

  1: <!-- 配置UrlRewrite核心过滤器 -->
  2: <filter>
  3:     <filter-name>UrlRewriteFilter</filter-name>
  4:     <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
  5: </filter>
  6: <filter-mapping>
  7:     <filter-name>UrlRewriteFilter</filter-name>
  8:     <url-pattern>/*</url-pattern>
  9:     <dispatcher>REQUEST</dispatcher>
 10:     <dispatcher>FORWARD</dispatcher>
 11: </filter-mapping>
 12: 

这段配置代码可以在urlrewrite的文档中找到:urlrewrite-3.2.0-src\manual\index.html

步骤4:编写urlrewrite.xml配置文件

拷贝urlrewrite-3.2.0-src\webapp\WEB-INF\urlrewrite.xml

标签说明:

<rule>:URL重写规则

<form>: 拦截请求的URL (写正则表达式)

<to> : 真实的URL

示例:

  1: <?xml version="1.0" encoding="utf-8"?>
  2: <!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
  3:     "http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
  4: 
  5: <!--
  6: 
  7: Configuration file for UrlRewriteFilter
  8: http://tuckey.org/urlrewrite/
  9: 
 10: -->
 11: <urlrewrite>
 12: <!-- rule: URL重写规则 -->
 13: <rule>
 14:     <!-- from: 拦截请求的URL (写正则表达式)
 15:         http://localhost:8080/hrm/
 16:     -->
 17:     <from>^/$</from>
 18:     <!-- to: 真实的URL -->
 19:     <to type="forward">/main.action</to>
 20: </rule>
 21: 
 22: <rule>
 23:     <!-- FrameSet请求的地址/left.html、/top.html -->
 24:     <from>^/(\w+)\.html$</from>
 25:     <to>/$1.action</to>
 26: </rule>
 27: 
 28: <!-- 模块级别的URL重写规则 -->
 29: <rule>
 30:     <!-- /document/selectDocument.html -->
 31:     <from>^/(\w+)/(\w+)\.html$</from>
 32:     <!-- /document/selectDocument.action -->
 33:     <to>/$1/$2.action</to>
 34: </rule>
 35: 
 36: <!-- 分页的URL重写规则 -->
 37: <rule>
 38:     <!--/notice/selectNotice/2.html -->
 39:     <from>^/(\w+)/(\w+)/([0-9]+)\.html$</from>
 40:     <!--/notice/selectNotice.action?pageModel.pageIndex=2 -->
 41:     <to>/$1/$2.action?pageModel.pageIndex=$3</to>
 42: </rule>
 43: </urlrewrite>
 44: 
 45: 

上面分别演示了几种请求地址的重写方式,<to>中隐射真实的地址,其中“$1”"$2”等对应<form>里面正则表达式段

image

如果你的工程里还用了其他框架进行了请求的拦截,比如Struts2,则要在<filter-mapping>里配置

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWORD</dispatcher>

  1: <!-- 配置Struts2核心过滤器 -->
  2: <filter>
  3:     <filter-name>struts</filter-name>
  4:     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  5: </filter>
  6: <filter-mapping>
  7:     <filter-name>struts</filter-name>
  8:     <url-pattern>*.action</url-pattern>
  9:     <dispatcher>REQUEST</dispatcher>
 10:     <dispatcher>FORWARD</dispatcher>
 11: </filter-mapping>
 12: 

步骤5:改写原来的求情地址,改为.html结尾(随便上面结尾都行,你喜欢的话.jaxp .asp都可以)

再把原来jsp页面里的xxx.action改为xxxx.html,示例

  1: <frameset rows="80,*" cols="*" frameborder="no" border="0" framespacing="0">
  2:   <frame src="${pageContext.request.contextPath}/top.html" name="title" scrolling="no" noresize="noresize">
  3:   <frameset cols="220,*" frameborder="no" border="0" framespacing="0">
  4:     <frame src="${pageContext.request.contextPath}/left.html" name="tree" scrolling="no" marginheight="0" marginwidth="0">
  5:     <frame src="${pageContext.request.contextPath}/right.html" name="main" scrolling="yes" frameborder="0" marginwidth="0" marginheight="0" noresize="noresize">
  6:   </frameset>
  7: </frameset>

上面把/top.action改成了/top.html,这里采用的是FORWORD跳转,地址栏看不到请求后的地址,即原来是这样的http://localhost:8080/hrm(项目名称)/会到主页面main.actin,在经过URL重写后转发,就看不到跳转后的请求main.action了,直接就是http://localhsot:8080/hrm/

在请求/left.html

猜你喜欢

转载自lishuaishuai.iteye.com/blog/2303277