SEO优化-伪静态-URLRewrite 详解
下面是文章是我在网上看到的,觉得写的还不错,我拿过来,修改了一些作者没有说到的地方.......
1. 在apache中配置
2. 用URLRewrite(详细:重点是UrlRewrite+Struts2)
1) 从http://tuckey.org/urlrewrite/ 下载最新的jar包下来,现时我用的是Url Rewrite3.2
2) 将urlrewrite.xml拷贝到WEB-INF目录下
3) 在web.xml中配置其拦截器。注意,拦截器应放在strutsFilter的前面:
[一般顺序是这样子的来排版的,字符编码过滤器, Hibernate Open Session In View 过滤器,UrlRewrite过滤器、struts过滤器。假如你有用到这些过滤器的话,就这样子拍,否则有时候会出现一些莫名其妙的问题。。。。。。。。]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>encodingFilter</filter-name> <filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</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>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST </dispatcher>
<dispatcher>FORWARD </dispatcher>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
<dispatcher>REQUEST </dispatcher>
<dispatcher>FORWARD </dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>
其中,<dispatcher>REQUEST </dispatcher>和<dispatcher>FORWARD </dispatcher> 主要说明该拦截器拦截的请求包括客户端的请求和从服务器端forward的请求。在很多的网文中,都提到struts2的<url-pattern>/*</url-pattern> 我试过,这样是会报内存溢出异常的。上述的是2.16的版本的配置。
以下是urlrewrite.xml的配置
<rule>
<from>/test.dhtml</from>
<to type="forward">test.action</to>
</rule>
<rule>
<from>^/([a-zA-Z]+)/save/id/([a-zA-Z0-9]*).dhtml</from>
<to type="forward">$1!save.action?id=$2</to>
</rule>
<rule>
<from>^/([a-zA-z]+)/([a-zA-Z0-9]*).dhtml</from>
<to type="forward">%{context-path}/$1!$2.action</to>
</rule>
<rule>
<from>^/content/([a-zA-Z]+.*).html</from>
<to type="forward">/WEB-INF/content/login-error.jsp</to>
</rule>
之前如果在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 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字符串的结束
常用的&要用 &来表示。$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&name=$4&date=$5
</to> < /rule>
注意:
1. 在uoutbound-rule的<from>标签里面如果出现“?”号,要把它转义,转义后是: “/?“,不然会出现404找不到错误。
2. 如果是多参数配置在url参数拼接时注意&符号的转义:如<to type="forward">/$1!$2.do?id=$3&name=$4&date=$5</to>
附加:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- UrlRewriteFilter filter -->
<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>
</filter>
<!-- Struts2 filter -->
<!--
在做上传文件的时候,要在web.xml中增加ActionContextCleanUp这个filter,如果不增加,会发生第一次上传取不到文件的情况
-->
<filter>
<filter-name>struts2-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<!-- 如果使用Urlrewrite,要指定filter-mapping的dispatcher方式 -->
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2-cleanup</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
</web-app>
urlrewrite.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN"
"http://tuckey.org/res/dtds/urlrewrite3.0.dtd">
<urlrewrite>
<rule>
<note>
<!-- 这是一个通用请求url rewrite
将请求forword url加上".action"的处理器上。例:
请求 http://{domain}/user/login 将被forward到 http://{domain}/user/login.do
请求 http://{domain}/user/login/ 将被forward到 http://{domain}/user/login.do
请求 http://{domain}/user/logout/ 将被forward到 http://{domain}/user/logout.do
-->
<!--
<from>^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?.html$</from>
<to type="forward">/$1.do</to>
-->
</note>
<!-- 匹配URL:login_reg_33.html,执行login Action的reg方法,带一个参数:33 -->
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)_([0-9a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do?id=$3</to>
</rule>
<!-- 匹配URL:login_reg_33.html,执行login Action的reg方法,多个参数:33,ydf,2012-03-31 -->
<!-- 注意多个参数之间连接的&需要换为&转移 -->
<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&name=$4&date=$5</to>
</rule>
<!-- 匹配URL:login_login.html,执行login Action的login方法 -->
<rule>
<from>^/([a-zA-Z]+?)_([a-zA-Z]+?)\.html$</from>
<to type="forward">/$1!$2.do</to>
</rule>
<!-- 匹配URL:user3/login/test/baidu/login_login.html,任意长度路径 ,执行login Action的login方法 -->
<rule>
<from>^/[_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+/[^~]+?\/([^\/]+?)_([^\.]+?)\.html$</from>
<to type="forward">/$1!$2.do</to>
</rule>
</urlrewrite>
SEO优化-伪静态-URLRewrite 详解的更多相关文章
- 大话SEO网站优化|SEO优化入门技术详解
网络营销 网络营销是借助一切被目标用户认可的网络应用服务平台开展的引导用户关注的行为或活动,目的是促进产品在线销售及扩大品牌影响力. web1.0时代有搜索引擎营销.BBS营销.邮件营销.病毒式营销. ...
- Android App优化之ANR详解
引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App ...
- (转)centos7优化内核参数详解
centos7优化内核参数详解 原文:http://blog.csdn.net/xiegh2014/article/details/52132863 cat /etc/sysctl.conf #CTC ...
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表.给常常使用的列建立索引.还有创建 ...
- Android内存优化—dumpsys meminfo详解
原创置顶 不死鸟JGC 最后发布于2018-12-24 14:19:28 阅读数 3960 收藏展开dumpsys 介绍Dumpsys用户系统诊断,它运行在设备上,并提供系统服务状态信息 命令格式: ...
- MySQL配置文件my.cnf参数优化和中文详解
Mysql参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的 ...
- 「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)
注意:以下都是在MySQL目录下的my.ini文件中改写(技术文). 一.InnoDB内存优化 InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存Inn ...
- JDK1.7中HashMap死环问题及JDK1.8中对HashMap的优化源码详解
一.JDK1.7中HashMap扩容死锁问题 我们首先来看一下JDK1.7中put方法的源码 我们打开addEntry方法如下,它会判断数组当前容量是否已经超过的阈值,例如假设当前的数组容量是16,加 ...
- MySQL 优化之EXPLAIN详解(执行计划)
学习MySQL时我们都知道索引对于一个SQL的优化很重要,而EXPLAIN关键字在分析是否正确以及高效的增加了索引时起到关键性的作用. 这篇文章显示了如何调用“EXPLAIN”来获取关于查询执行计划的 ...
随机推荐
- 我的Android进阶之旅------>Android关于TextWatcher的初步了解
首先来看一下TextWatcher的源代码 package android.text; /** * When an object of a type is attached to an Editabl ...
- 我的Android进阶之旅------>Android基于HTTP协议的多线程断点下载器的实现
一.首先写这篇文章之前,要了解实现该Android多线程断点下载器的几个知识点 1.多线程下载的原理,如下图所示 注意:由于Android移动设备和PC机的处理器还是不能相比,所以开辟的子线程建议不要 ...
- Xen虚拟化基础篇
一.xen的简介 Xen是一个开放源代码虚拟机监视器,由剑桥大学开发.它打算在单个计算机上运行多达128个有完全功能的操作系统. 在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(& ...
- PAT 天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹 【BFS】
题目链接 https://www.patest.cn/contests/gplt/L2-016 思路 用BFS 每层 遍历当代 并且查找当代是否有重复 有重复就跳出 然后 POP 并且将他们的下一代 ...
- Redis高级进阶(二)
一.消息通知 在一些网站上,经常会有一些发布/订阅或者邮件订阅的功能,尤其一些博客上.其实这种问题很常见,当页面需要进行如发送邮件.复杂的计算时会阻塞页面的渲染.为了避免用户等待太久,应该使用其他进程 ...
- CSS3分享按钮动画特效
在线演示 本地下载
- An Assembly Language
BUFFER OVERFLOW 3 An Assembly Language Introduction Basic of x86 Architecture Assembly Language Comp ...
- Java 面试题问与答:编译时与运行时
Java 面试题问与答:编译时与运行时 2012/12/17 | 分类: 基础技术, 职业生涯 | 5 条评论 | 标签: RUNTIME, 面试 分享到:58 本文作者: ImportNew - 朱 ...
- 创建HTML5/CSS3单页Web布局
1. [图片] 第1步:PhotoShop 2. [代码]第2步:index.html <!DOCTYPE html><!-- The new doctype -->< ...
- R语言矩阵运算
R语言矩阵运算 主要包括以下内容:创建矩阵向量:矩阵加减,乘积:矩阵的逆:行列式的值:特征值与特征向量:QR分解:奇异值分解:广义逆:backsolve与fowardsolve函数:取矩阵的上下三角元 ...