apche IIS .htaccess httpd.ini Rewrite RewriteRule详解
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
2、举例说明:
下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.cwbgj.com和203.81.23.202都跳转到主机前缀为http://www.cwbgj.com,避免当用户在地址栏写入http://cwbgj.com时不能以会员方式登录网站。
NameVirtualHost 192.168.100.8:80
ServerAdmin webmaster@cwbgj.com
DocumentRoot "/web/webapp" ServerName www.cwbgj.com ServerName cwbgj.com RewriteEngine on #打开rewirte功能 RewriteCond %{HTTP_HOST} !^www.cwbgj.com [NC] #声明Client请求的主机中前缀不是www.cwbgj.com,[NC]的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC] #声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写 RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写 RewriteRule ^/(.*) http://www.cwbgj.com/ [L]#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.cwbgj.com/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。 例二.将输入 folio.jaeer.com 的域名时跳转到profile.jaeer.comlisten 8080
NameVirtualHost 10.122.89.106:8080 ServerAdmin webmaster@cwbgj.comDocumentRoot "/usr/local/www/apache22/data1/"ServerName profile.jaeer.comRewriteEngine on RewriteCond %{HTTP_HOST} ^folio.jaeer.com [NC]RewriteRule ^/(.*) http://profile.jaeer.com/ [L]3.Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。4) P(force proxy) 强制使用代理转发。5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。6) N(next round) 重新从第一条规则开始运行重写过程。7) C(chained with next rule) 与下一条规则关联如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求10) NC(no case) 不区分大小写11) QSA(query string append) 追加请求字符串12) NE(no URI escaping of output) 不在输出转义特殊字符例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed13) PT(pass through to next handler) 传递给下一个处理例如: RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理 Alias /def /ghi 14) S=num(skip next rule(s)) 跳过num条规则15) E=VAR:VAL(set environment variable) 设置环境变量4.Apache rewrite例子集合
在 httpd 中将一个域名转发到另一个域名虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记。这时需要将原来的域名webhosting-world.com, 以及论坛所在地址 webhosting-world.com/forums/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://www.webhosting-world.com/forums/-f60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.wbhw.com/-f60.html, 这就需要用 apache 的 Mod_rewrite 功能来实现。
在中添加下面的重定向规则:
RewriteEngine On
# Redirect webhosting-world.com/forums to bbs.wbhw.comRewriteCond %{REQUEST_URI} ^/forums/RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]# Redirect webhosting-world.com to wbhw.comRewriteCond %{REQUEST_URI} !^/forums/RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]添加了上面的规则以后, 里的全部内容如下:
ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.comDocumentRoot /path/to/webhosting-world/rootServerName www.webhosting-world.comRewriteEngine On# Redirect webhosting-world.com/forums to bbs.wbhw.comRewriteCond %{REQUEST_URI} ^/forums/RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L]# Redirect webhosting-world.com to wbhw.comRewriteCond %{REQUEST_URI} !^/forums/RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]URL重定向
例子一:
1.http://www.csdn.cc/xxx.php-> http://www.csdn.cc/xxx/
2.http://yyy.csdn.cc-> http://www.csdn.cc/user.php?username=yyy 的功能 RewriteEngine On RewriteCond %{HTTP_HOST} ^www.csdn.cc RewriteCond %{REQUEST_URI} !^user\.php$ RewriteCond %{REQUEST_URI} \.php$ RewriteRule (.*)\.php$ http://www.csdn.cc/$1/ [R] RewriteCond %{HTTP_HOST} !^www.csdn.cc RewriteRule ^(.+) %{HTTP_HOST} [C] RewriteRule ^([^\.]+)\.zzz\.com http://www.csdn.cc/user.php?username=$1例子二:
/type.php?typeid=* --> /type*.html
/type.php?typeid=*&page=* --> /type*page*.htmlRewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]5.使用Apache的URL Rewrite配置多用户虚拟服务器
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.cwbgj.com和 *.semcase.cn全部解析到了我的这台Linux Server上。
然后,看一下我的Apache中关于*.cwbgj.com的虚拟主机的设定。
#*.com,*.osall.net
ServerAdmin webmaster@cwbgj.com
DocumentRoot /home/www/www.cwbgj.com ServerName dns.cwbgj.comServerAlias dns.cwbgj.com cwbgj.com semcase.net *.cwbgj.com *.semcase.net CustomLog /var/log/httpd/osa/access_log.log" common ErrorLog /var/log/httpd/osa/error_log.log"AllowOverride NoneOrder deny,allow #AddDefaultCharset GB2312 RewriteEngine on RewriteCond %{HTTP_HOST} ^[^.]+\.osall\.(com|net)$ RewriteRule ^(.+) %{HTTP_HOST}$1 [C] RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$/home/www/www.cwbgj.com/sylvan$3?un=$1&%{QUERY_STRING} [L] 在这段设定中,我把*.semcase.net和*.cwbgj.com 的Document Root都设定到了 /home/www/www.cwbgj.com但是,继续看下去,看到...配置了吗?在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能RewriteCond %{HTTP_HOST} ^[^.]+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.cwbgj.com 或者 xxxx.semcase.cn 就执行下面一句RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.cwbgj.com/sylvan$3?un=$1&%{QUERY_STRING} [L]# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.cwbgj.com目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。例子:
<FilesMatch "\.(bak|inc|lib|sh|tpl|lbi|dwt)$"> order deny,allow deny from all</FilesMatch>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(flowerworld.cn)(:80)? [NC]RewriteRule ^(.*) [R=301,L]RewriteCond %{HTTP_HOST} ^()? [NC]RewriteRule ^(.*) [R=301,L]RewriteCond %{HTTP_HOST} ^(losoin.com)(:80)? [NC]RewriteRule ^(.*) [R=301,L]
RewriteRule ^index\.html$ index\.php [QSA,L]RewriteRule ^m\.html$ view/admin/adminView\.php?pageAction=quit [QSA,L]
RewriteRule ^info/([0-9]+)\.html$ view/infoView.php?pageAction=viewInfo&id=$1 [QSA,L]RewriteRule ^sell/([0-9]+)\.html$ view/module/sellView.php?pageAction=viewSellInfo&sellId=$1 [QSA,L]
RewriteRule ^superMarket/([0-9]+)\.html$ view/module/superMarketView.php?pageAction=viewSuperMarketInfo&superMarketId=$1 [QSA,L]
RewriteRule ^product/([0-9]+)\.html$ view/productPostView.php?pageAction=productPostShow&id=$1 [QSA,L]
RewriteRule ^productClass/([0-9]+)\.html$ view/productView.php?pageAction=productClassIndex&id=$1 [QSA,L]
RewriteRule ^enterprise/([0-9]+)/(.*)-([0-9]+)-([0-9]+)$ view/enterpriseMemberView.php?pageAction=memberShow&id=$1&actionShow=$2&showType=$3&appendId=$4 [QSA,L]RewriteRule ^enterprise/([0-9]+)/(.*)$ view/enterpriseMemberView.php?pageAction=memberShow&id=$1&actionShow=$2 [QSA,L]RewriteRule ^enterprise/([0-9]+)\.html$ view/enterpriseMemberView.php?pageAction=memberShow&id=$1 [QSA,L]RewriteRule ^enterprise/([0-9]+)$ view/enterpriseMemberView.php?pageAction=memberShow&id=$1 [QSA,L]
RewriteRule ^news\.html$ view/newsView.php [QSA,L]
RewriteRule ^enterprise\.html$ view/enterpriseView.php [QSA,L]RewriteRule ^quotedPrice\.html$ newView/searchQpView.php [QSA,L]RewriteRule ^product\.html$ view/productView.php [QSA,L]RewriteRule ^sell\.html$ view/module/sellView.php [QSA,L]RewriteRule ^wantToBuy\.html$ view/module/wantToBuyView.php [QSA,L]RewriteRule ^superMarket\.html$ view/module/superMarketView.php [QSA,L]RewriteRule ^help\.html$ view/newsView.php?pageAction=help [QSA,L]
RewriteRule ^column/([0-9]+)\.html$ view/newsView.php?pageAction=column&id=$1 [QSA,L]
RewriteRule ^product/([0-9]+)\.html$ view/productPostView.php?pageAction=productPostShow&id=$1 [QSA,L]
RewriteRule ^enterprise/([0-9]+)/(.*)-([0-9]+)-([0-9]+).html$ view/enterpriseMemberView.php?pageAction=memberShow&id=$1&actionShow=$2&showType=$3&appendId=$4 [QSA,L]
//结果是 enterprise/32/open-12-13.html//32是参数1,open是参数2,12是参数3,13是参数4