Apache Rewrite规则详解
参考链接:http://slj.me/2009/04/apache-rewrite-regular/
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属性(httpd.conf中的Option FollowSymLinks)且在.htaccess里要声明RewriteEngine on。
2. Apache mod_rewrite规则中的标记含义
- 1 1) R[=code](force redirect) 强制外部重定向
- 2 强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
- 3 2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
- 4 3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
- 5 4) P(force proxy) 强制使用代理转发。
- 6 5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
- 7 6) N(next round) 重新从第一条规则开始运行重写过程。
- 8 7) C(chained with next rule) 与下一条规则关联
- 9 如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
- 10 8) T=MIME-type(force MIME type) 强制MIME类型
- 11 9) NS (used only if no internal sub-request) 只用于不是内部子请求
- 12 10) NC(no case) 不区分大小写
- 13 11) QSA(query string append) 追加请求字符串
- 14 12) NE(no URI escaping of output) 不在输出转义特殊字符
- 15 例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
- 16 13) PT(pass through to next handler) 传递给下一个处理
- 17 例如:
- 18 RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
- 19 Alias /def /ghi
- 20 14) S=num(skip next rule(s)) 跳过num条规则
- 21 15) E=VAR:VAL(set environment variable) 设置环境变量
3.举例说明
例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn。
- NameVirtualHost 70.40.213.183:80
- ServerAdmin slj@kiya.cn
- DocumentRoot “/web”
- ServerName kiya.cn
- RewriteEngine on #打开rewirte功能
- RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写
- RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
- RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空
- RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。
例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]
- RewriteRule ^(.*) http://www.sicasoft.com/ [L]
例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.sicasoft.com/tread-60.html,而其他网页,如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上,而是到www.sicasoft.com/purchase
按照这样的要求重定向规则应该这样写:
- RewriteEngine On
- RewriteCond %{REQUEST_URI} ^/bbs/
- RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
- RewriteCond %{REQUEST_URI} !^/bbs/
- RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]
例四.同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能
- RewriteEngine On
- RewriteCond %{HTTP_HOST} ^www.zzz.com
- RewriteCond %{REQUEST_URI} !^user.php$
- RewriteCond %{REQUEST_URI} .php$
- RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
- RewriteCond %{HTTP_HOST} !^www.zzz.com
- RewriteRule ^(.+) %{HTTP_HOST} [C]
- RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1
例五.
/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
- RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
- RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
例六.使用Apache的URL Rewrite配置多用户虚拟服务器
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。
然后,看一下我的Apache中关于*.kiya.us的虚拟主机的设定。
- ServerAdmin webmaster@kiya.us
- DocumentRoot /home/www/www.kiya.us
- ServerName dns.kiya.us
- ServerAlias dns.kiya.us kiya.us *.kiya.us
- CustomLog /var/log/httpd/osa/access_log.log” common
- ErrorLog /var/log/httpd/osa/error_log.log”
- AllowOverride None
- Order deny,allow
- #AddDefaultCharset GB2312
- RewriteEngine on
- RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
- RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
- RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us
继续看下去,在这里我就配置了URL Rewrite规则。
- RewriteEngine on #打开URL Rewrite功能
- RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.kiya.us 或者 xxxx.kiya.cn 就执行下面一句
- RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
- RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
- # 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。
设置后重启Apache服务器就大功告成了!
例七.Rewrite 防盗链正则,不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链.
- RewriteEngine On
- RewriteCond %{HTTP_REFERER} chinaz.com [NC]
- RewriteCond %{HTTP_REFERER} im286.com [NC]
- RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]
Apache Rewrite规则详解的更多相关文章
- Apache Rewrite 规则详解
在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...
- Apache Rewrite规则详解[转]
1.Rewrite规则简介:Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用 ...
- Apache Rewrite 规则详解知识大全
Rewrite是一种服务器的重写脉冲技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术.它还可以实现限制特定IP访问网站的功能. 1.Rewrite标志 R[=code](for ...
- Nginx 常用全局变量 及Rewrite规则详解
每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...
- Nginx Rewrite规则详解
Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等. Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种 ...
- nginx配置 location及rewrite规则详解
1. location正则写法 语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url ...
- Apache Rewrite 中文详解
这几天一直在研究Apache的重写规则,虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以我想写一个简单的易于理解的教程,我学习.htaccess是从目录保护开始的,这个也比较简单, ...
- HTTP POST请求的Apache Rewrite规则设置
最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据.http post请求的url格式为: ...
- Nginx网络架构实战学习笔记(一):Nginx简介、安装、信号控制、nginx虚拟主机配置、日志管理、location 语法、Rewrite语法详解
文章目录 nginx简介 nginx安装 nginx信号控制 nginx虚拟主机配置 日志管理 location 语法 精准匹配的一般匹配 正则匹配 总结 Rewrite语法详解 nginx简介 Ng ...
随机推荐
- 有关AngularJS请求Web API资源的思路
页面部分大致如下: <body ng-app="productManagement"> ... <div ng-include="'app/produc ...
- Android之 系统启动流程
在前一篇文章"Android之 看“马达”如何贯通Android系统 (从硬件设计 --> 驱动 --> HAL --> JNI --> Framework --&g ...
- tms web core程序部署
tms web core程序部署 笔者把已经开发好的TMS WEB CORE程序部署到阿里云服务器上面,来作为例子. 1)复制TMS WEB CORE前端程序到服务器的c:\room\ 2)复制TMS ...
- sqlite3 插入数据的时候,返回SQLITE_CONSTRAINT
sqlite3 插入数据的时候.返回SQLITE_CONSTRAINT 原因是:数据库的表的名字是纯数字. 大改这个原因太诡异了.创建的时候能够创建成功. 插入数据的时候就失败,由于表名是纯数字. 附 ...
- python测试开发django-13.操作数据库(增删改查)
前言 django的models模块里面可以新增一张表和字段,通常页面上的数据操作都来源于数据库的增删改查,django如何对msyql数据库增删改查操作呢? 本篇详细讲解django操作mysql数 ...
- 深入理解Java并发之synchronized实现原理
深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...
- Material Designer的低版本兼容实现(六)—— Ripple Layout
新版的Android5.0添加了涟漪效果,虽然开源的库提供了各种控件便于大家使用涟漪效果.但是仍旧不可能满足所有需求,因此我今天改出来一个类叫做,LayoutRipple,其实感觉跟应该叫Ripple ...
- 使用强大的 Mockito 测试框架来测试你的代码
原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...
- MongoDB 分布式部署教程
本文将介绍如何使用 MongoDB 提供的 Replica Set 和 Shards 功能构建一个分布式 MongoDB 集群. Replica Set 部署 我们先从部署一个三节点的 Replica ...
- Caffe常用层参数介绍
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/Cheese_pop/article/details/52024980 DATA crop:截取原图像中一个 ...