注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无明

 
 
 

日志

 
 

Apache模块 mod_rewrite  

2012-02-18 23:14:58|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Apache模块 mod_rewrite
RewriteCond指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用
正则表达式只是用于字符串匹配的特征串, 我们从如何表示一个字符开始.
[ ] : 表示选择一个字符.
(.) :
表示任何了个除换行符(\n)之外的字符.
\r  :
表示回车
\n  :
表示换行
\t  :
表示TAB
\w  :
表示字母,数字或下划线, 等同于[A-Za-z0-9_]
\W  :
表示非字母,数字或下划线, 等同于[^A-Za-z0-9_]
\s  :
表示空白字符, 等同于[ \f\n\r\t]
\S  :
表示非空白字符, 等同于[^ \f\n\r\t]
\d  :
表示数字字符, 等同于[0-9]
\D  :
表示非数字字符, 等同于[^0-9]
    当我们需要表示有特定意义的字符时,  可以用"\"来进行转义, 如要表示一对中括号, 就用"\[\]",其他的类似. "*", "+", ".", "(", ")", "$", "?", "|", "{"出现在中括号内时, 就只表示字符本身而没有其他含义.
| : 或者
* : 表示出现0个或多个
+ : 表示出现1个或多个
? : 表示出现0个或1
{n} : 表示重复出现n
{m,n} : 表示重复出现最少m, 最多n
    到这一部份就比较难理解了, 还是举例子来解释吧.
(ab|cd|ef)
"ab", "cd", "ef"中的任一个
[a-zA-Z]+
只包括字母的单词
[A-Z][a-z]*
第一个字母是大写的单词
\d+\.?\d*
表示一个数字
[a-z]{4}
四个小写字母
[+-]?\d*\.\d{1,6}
小数点后有16位的数
.|\n
任何字符
.*
一行
^\s*$
空行
 
使用UrlRewriteFilter动态URL静态化
假设你已经使用mod_jk2.so整合了Apache2.05x与Tomcat5.x
要完成的功能如下重定向:
1. 修改Apache2\conf\httpd.conf文件,加载mod_rewrite.so
LoadModule rewrite_module modules/mod_rewrite.so

2.
在每个虚拟主机的地方设置Rewrite参数
<VirtualHost *:80>
    ServerAdmin wiseweidong@gmail.com
    DocumentRoot "I:/Job/Java"
    ServerName localhost
    RewriteEngine on
    RewriteRule /([0-9]+).html /test.jsp?id=$1 [PT]
    RewriteRule /([0-9]+)_([0-9]+).html /content.jsp?id=$1&id2=$2 [PT]
</VirtualHost>
 
 
RewriteRule
Syntax: RewriteRule Pattern Substitution [flags]
  一条RewriteRule指令,定义一条重写规则,规则间的顺序非常重要。当前的URL不一定是用记最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。
  对mod_rewrite来说,!是个合法的模板前缀,表示“非”的意思,这对描述“不满足某种匹配条件”的情况非常方便,或用作最后一条默认规则。当使用!时,不能在模板中有分组的通配符,也不能做后向引用。
  当匹配成功后,Substitution会被用来替换相应的匹配,它除了可以是普通的字符串以外,还可以包括:
  1. $N,引用RewriteRule模板中匹配的相关字串,N表示序号,N=0..9
  2. %N,引用最后一个RewriteCond模板中匹配的数据,N表示序号
  3. %{VARNAME},服务器变量
  4. ${mapname:key|default},映射函数调用
这些特殊内容的扩展,按上述顺序进行。

mod_rewrite Flags

mod_rewrite用”FLAGS”来建立重写条件以及其他属性。我们用中括弧将FLAGS包起来,放在条件或者是规则的末尾,用逗号将多个FLAGS分隔。以下列表是你需要熟悉的几个主要FLAGS:

  1. 'redirect|R [=code]' (强制重定向)
      给当前的URI增加前缀http://thishost[:thisport]/, 从而生成一个新的URL,强制生成一个外部重定向(external redirection,指生的URL发送到客户端,由客户端再次以新的URL发出请求,
  2. 'forbidden|F' (强制禁止访问URL所指的资源)
      立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用,可以阻断访问某些URL。

  3. 'gone|G' (强制返回URL所指资源为不存在(gone))
      立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了
  4. # 'proxy|P' (强制将当前URL送往代理模块(proxy module))
      这个标志,强制将substitution当作一个发向代理模块的请求,并立即将共送往代理模块。因此,必须确保substitution串是一个合法的URI (如, 典型的情况是以http://hostname开头),否则会从代理模块得到一个错误. 这个标志,是ProxyPass指令的一个更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。
      注意,使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令,来检查输出中是否含有mod_proxy.c来确认一下。如果没有,而又需要使用这个功能,则需要重新编译``httpd''程序并使用mod_proxy有效。

  5. 'last|L' (最后一条规则)
      中止重写流程,不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。

  6. 'next|N' (下一轮)
      重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。

  7. 'nocase|NC' (模板不区分大小写)
      这个标志会使得模板匹配当前URL时忽略大小写的差别。

  8. 'qsappend|QSA' (追加请求串(query string))
      这个标志,强制重写引擎为Substitution的请求串追加一部分串,则不是替换掉原来的。借助这个标志,可以使用一个重写规则给请求串增加更多的数据。
  9. ornext|OR -[OR]作为默认值[AND]的反义词,可以通过逻辑关系将一系列重写条件组合起来。


    RewriteRule news/(\d+)\.html news\.php\?id=$1 [N,L]
    这样就实现了将http://localhost/news/1000.html 解析为 http://localhost/news.php?id=1000的功能
    http://211.100.227.106:8080/wp-cp-m7/index.jsp?mod=free&act=watch&cid=714
    index/[a-zA-Z]/[a-zA-Z]/(\d+)_(\d+)\.html index\.jsp\?mod=$1&act=$2&cid=
    RewriteRule ^(power([^/]*))/([^/]+)\.htm(l?)$ series\.php\?fclassname=$1&fb_babrand=$3 [NC]
    $ 匹配输入字符串的结束位置。如
    URL http://host/test.jps?id=1 重定向为 http://host/1.html
    URL http://host/conent.jsp?id=1&id2=3 重定向为 http://host/1_3.html
    RewriteEngine on
        RewriteRule /([0-9]+).html /test.jsp?id=$1 [PT]
        RewriteRule /([0-9]+)_([0-9]+).html /content.jsp?id=$1&id2=$2 [PT]
    index.jsp?lid=2&mod=free&act=watch&cid=714&mid=112312&type=adlska
    index/lang/mod/act/type/cid_mid.html
    RewriteRule index/(\d+\.?\d*)/(a-z)/(a-z)/(a-z)/([0-9]+)_([0-9]+).html /index.jsp?lid=$1&mod=&2&act=$3&type=$4&cid=$5&mid=$6 [PT]
    RewriteRule index/(a-z)/(a-z)/(a-z)/([0-9]+)_([0-9]+).html /index.jsp?mod=&1&act=$2&type=$3&cid=$4&mid=$5 [PT]
    RewriteRule /(a-z)/(a-z)/([0-9]+)_([0-9]+).html /?mod=&1&act=$2&cid=$3&mid=$4 [PT]
    index.jsp?mod=free&act=watch&cid=714
    index.jsp?mod=free&act=watch
    index.jsp?mod=free
                 
                   RewriteRule ^([^/]+)/([^/]+)/(\d+)_(\d+).html$ /index.jsp?mod=$1&act=$2&cid=$3&mid=$4
     RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(\d+)_(\d+).html$ /index.jsp?lid=$1&mod=$2&act=$3&cid=$4&mid=$5
             
     RewriteRule ^([^/]+)/([^/]+)/(\d+).html$ /index.jsp?mod=$1&act=$2&cid=$3
     RewriteRule ^([^/]+)/([^/]+)/(\d+)/(\d+).html$ /index.jsp?lid=$1&mod=$2&act=$3&cid=$4
           
     RewriteRule ^(\d+)/(\d+).html$ /index.jsp?mod=$1&act=$2
     RewriteRule ^(\d+)/([^/]+)/([^/]+).html$ /index.jsp?lid=$1&mod=$2&act=$3
         
     RewriteRule ^([^/]+).html$ /index.jsp?mod=$1
     RewriteRule ^(\d+)/([^/]).html$ /index.jsp?lid=$1&mod=$2
  评论这张
 
阅读(498)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018