Apache Rewrite 规则详解




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.colorme.com

和203.81.23.202都跳转到主机前缀为http://www.colorme.com.cn,避免当用户在地址栏

写入http://colorme.com.cn时不能以会员方式登录网站。

NameVirtualHost 192.168.100.8:80 ServerAdmin webmaster@colorme.com.cn

DocumentRoot "/web/webapp" ServerName www.colorme.com.cn

ServerName colorme.com.cn

 

RewriteEngine on #打开rewirte功能

 

#声明Client请求的主机中前缀不是www.colorme.com.cn,[NC]的意思是忽略大小写

RewriteCond %{HTTP_HOST} !^www.colorme.com.cn [NC]

 

#声明Client请求的主机中前缀不是203.81.23.202,[NC]的意思是忽略大小写

RewriteCond %{HTTP_HOST} !^203.81.23.202 [NC]

 

 #声明Client请求的主机中前缀不为空,[NC]的意思是忽略大小写

RewriteCond %{HTTP_HOST} !^$

 

#含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到

#http://www.colorme.com.cn/,[L]意味着立即停止重

#写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功

#能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。

RewriteRule ^/(.*) http://www.colorme.com.cn/ [L]

 

 

例二.将输入 folio.test.com 的域名时跳转到profile.test.com

listen 8080

NameVirtualHost 10.122.89.106:8080

ServerAdmin webmaster@colorme.com.cn

DocumentRoot "/usr/local/www/apache22/data1/"

ServerName profile.test.com

RewriteEngine on

RewriteCond %{HTTP_HOST} ^folio.test.com [NC]

RewriteRule ^/(.*) http://profile.test.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=zed

13) 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.com

RewriteCond %{REQUEST_URI} ^/forums/

RewriteRule /forums/(.*) http://bbs.wbhw.com/$1 [R=permanent,L] #

Redirect webhosting-world.com to wbhw.com

RewriteCond %{REQUEST_URI} !^/forums/

RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

 

添加了上面的规则以后, 里的全部内容如下:

<VirtualHost *>
        Servername btmuchina.51job.com
        Documentroot /www/htdocs/companyads/campus/btmu
        CustomLog "|/usr/local/sbin/cronolog /var/www/logs/`hostname`_btmuaccess_log%m%d" combined env=!image-request
        RewriteEngine on
        RewriteCond %{REQUEST_URI} ^campus.51job.com/btmu/
        RewriteRule campus.51job.com/btmu/(.*) http://{SERVER_NAME}/$1 [R]
</VirtualHost>

RedirectMatch permanent ^/(.*)$ http://www.new.com/$1

ServerAlias webhosting-world.com
ServerAdmin admin@webhosting-world.com

ServerName www.webhosting-world.com
DocumentRoot /path/to/webhosting-world/root
RewriteEngine On #

Redirect webhosting-world.com/forums to bbs.wbhw.com

RewriteCond %{REQUEST_URI} ^/forums/
RewriteRule /forums/(.*) http://bbs.wbhw.com/$1

[R=permanent,L] #

Redirect webhosting-world.com to wbhw.com

RewriteCond %{REQUEST_URI} !^/forums/
RewriteRule /(.*) http://www.wbhw.com/$1 [R=permanent,L]

 

URL重定向 例子一:

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]

 

5.使用Apache的URL Rewrite配置多用户虚拟服务器 要实现这个功能,首先要在DNS服务器上打开域

名的泛域名解析(自己做或者找域名服务商做)。

比如,我就把 *.semcase.com和 *.semcase.cn全部解析到了我的这台Linux Server上。

 然后,看一下我的Apache中关于*.semcase.com的虚拟主机的设定。

#*.com,*.osall.net ServerAdmin webmaster@semcase.com

 

DocumentRoot /home/www/www.semcase.com

ServerName dns.semcase.com

ServerAlias dns.semcase.com semcase.com semcase.net *.semcase.com *.semcase.net

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} ^[^.]+\.osall\.(com|net)$

RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

RewriteRule ^([^.]+)\.osall\.(com|net)(.*)$ /home/www/www.semcase.com/sylvan$3?un=$1&%{QUERY_STRING} [L]

 

在这段设定中,我把*.semcase.net和*.semcase.com 的Document Root都设定到了

/home/www/www.semcase.com 但是,继续看下去,看到...配置了吗?在这里我就配置了URL

Rewrite规则。 RewriteEngine on #打开URL Rewrite功能 RewriteCond %{HTTP_HOST} ^[^.]

+.osall.(com|net)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.semcase.com 或者

xxxx.semcase.cn 就执行下面一句 RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整

的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思

RewriteRule ^([^.]+).osall.(com|net)(.*)$ /home/www/dev.semcase.com/sylvan$3?

un=$1&%{QUERY_STRING} [L] # 最关键的是这一句,使用证则表达式解析用户输入的URL地址,

把主机名中的用户名信息作为名为un的参数传给/home/www/dev.semcase.com目录下的脚本,并

在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L] 规则)。注意,在

这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用

http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL

地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二

级域名虚拟服务器。这样设置后,重启Apache服务器,测试一下,就大功告成了! 

转载于:https://www.cnblogs.com/feihongwuhen/archive/2010/07/28/7170407.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php源码编程,10个小技巧让你做好php源码编程

PHP是目前使用最广泛的网站编程语言&#xff0c;也是今后发展的一大趋势。有很多站长或多或少掌握一些php编程方法&#xff0c;下面小编就介绍十点实用的php编码技巧。1、cho比print 快&#xff0c;并且使用echo的多重参数(译注&#xff1a;指用逗号而不是句点)代替字符串连接&…

iPhone与Android手机 各个型号的UserAgent

微信端模拟&#xff1a;Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 MicroMessenger/5.2.380■iPhone●iOSMozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/…

动态调用WCF服务[转]

原文地址&#xff1a;http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx客户端调用wcf &#xff0c;有时需要动态的调用服务端的WCF中的方法&#xff0c;本方法&#xff0c;反射wcf 的接口&#xff0c;动态调用接口中的方法。 主要为&#xff0c;动态绑定&#x…

java 正规 忽略,java-正则表达式查找变量并忽略方法

我正在尝试编写一个正则表达式,以查找给定一段JavaScript代码中的所有变量(并且只有变量,完全忽略方法).实际的代码(执行regex的代码)是用Java编写的.现在,我有这样的事情&#xff1a;Matcher matcherPattern.compile(".*?([a-z]\w*?).*?").matcher(string);while…

【吐槽】博客园新的原创文章在搜索引擎的排名不及转载的站点

最近写博客比较多&#xff0c;但发现文章被一些网站转载后&#xff0c;排名比博客园的链接还要高&#xff0c;有些搜索引擎甚至连博客园的链接都没有&#xff0c;坑爹&#xff0c;坑爹。。。 以前博客园的网友也遇到过类似的情况&#xff0c;也分享过一些防转载的经验&#xff…

Qt之程序发布以及打包成exe安装包

一、简述 Qt项目开发完成之后&#xff0c;需要打包发布程序&#xff0c;而因为用户电脑上没有Qt配置环境&#xff0c;所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中&#xff0c;然后再用 Inno Setup打包工具 打包成一个exe安装包&#xff0c;就可以发布了…

把ASP应用中的Session传递给asp.net应用

ASP.NET APPLICATION要使用原来的ASP用户系统&#xff0c;于是问题出现了&#xff0c;ASP APPLICATION怎样才能让用户登录的状态及用户信息在ASP.NET中依然有效呢。于是我们考虑用构造FORM来自动提交传递ASP应用中的Session变量。例子如下ASP应用URL为http://127.0.0.1/asp/&am…

linux下生成key

linux下生成key 使用public/private key让putty(ssh)自动登录&#xff08;以及linux上使用密钥做ssh自动登陆&#xff09; 方法一&#xff1a;使用puttygen.exe 第一步&#xff1a;生成密匙 运行puttygen.exe&#xff0c;选择需要的密匙类型和长度&#xff0c;使用默认的SSH2(R…

php获取字符串扩展,PHP7扩展开发之字符串处理

标签&#xff1a;本文和大家分享的主要是PHP7扩展开发中字符串的处理相关知识&#xff0c;希望通过本文的分享能帮助大家更好的学习php。这次&#xff0c;我们来看看字符串在PHP扩展里面如何处理。示例代码如下&#xff1a;$len strlen($prefix);$substr substr($string, 0, …

使用Nginx+WordPress搭建个人网站

背景 很多研究技术的朋友喜欢写博客。如果希望搭建一个完全属于自己的网站&#xff0c;也并不困难。这里简要分享一下我搭建这个博客网站的经验。 关键步骤 购买服务器、域名、DNS云解析服务网站备案&#xff08;可选&#xff09;安装NginxWordPressMySQLPHP配置WordPress运行网…

UNION ALL returning wrong results?

有应用人员反映某套Linux上的11.2.0.1数据库系统中出现了UNION ALL后返回的结果集不正确的问题,我们具体分析下出现问题的其中一条语句: SELECT MTL_SECONDARY_INVENTORIES.SECONDARY_INVENTORY_NAME,MTL_SECONDARY_INVENTORIES.ORGANIZATION_ID,MTL_SECONDARY_INVENTORIES.DES…

android jni java类型与c语言类型互换

1.java String转换 C str char* Jstring2CStr(JNIEnv* env, jstring jstr) {char* rtn NULL;jclass clsstring (*env)->FindClass(env,"java/lang/String");jstring strencode (*env)->NewStringUTF(env,"GB2312");jme…

zip:命令行下zip压缩/解压缩

在Ubuntu 18.04下验证&#xff0c;造冰箱的大熊猫cnblogs 2019/6/6 1压缩单个文件zip package.zip file2压缩多个文件zip package.zip file1 file23压缩单个文件夹zip -r package.zip folder4压缩多个文件夹zip -r package.zip folder1 folder25压缩文件、文件夹zip -r package…

inv(a) matlab,在MATLAB中,inv(A)表示的是()

在MATLAB中&#xff0c;inv(A)表示的是()答&#xff1a;矩阵A的逆下列不属于植物生长调节剂的是( )。答&#xff1a;DDTHe received four years of training in English and two years in English teaching.He is a _______ English instructor.答&#xff1a;qualified第五章&…

TSQL与PL/SQL的比较

TSQL与PL/SQL的比较 以前一直用mssql 做开发&#xff0c;最近的项目都Oracle, 1)数据类型 TSQL PL/SQL numeric(p,s) numeric(p,s) or NUMBER(p,s) decimal(p,s) decimal(p,s) or NUMBER(p,s) char(m) Char(m) varchar(m) varchar2(m) datetime date…

前端文件表单/ajax上传实例代码

表单上传文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试文件上传</title> </head> <body> <form action"/attach/upload" enctype"multipart/form-dat…

matlab2012生成dll,64位win7下vc2010如何调用matlab2012a中生成的dll文件

本文说是原创&#xff0c;但核心部分是参考http://blog.sina.com.cn/s/blog_a5fdbf0101018n91.html(大家可以先看看这篇文章)&#xff0c;在此再次感谢debug童鞋。debug童鞋的系统是 win7 32位 vc2010 (32位编译器) Matlab2012a &#xff0c;如果童鞋们win7是32位的话就不必…

CentOS/Linux 卸载MATLAB

rm -rf /usr/local/MATLAB/R2012arm /usr/local/bin/matlab /usr/local/bin/mcc /usr/local/bin/mex /usr/local/bin/mbuild

.NET中的正则表达式 (三)RegexCompilationInfo 类

RegexCompilationInfo 类 提供编译器用于将正则表达式编译为独立程序集的信息。 属性 IsPublic&#xff1a;获取或设置一个值&#xff0c;该值指示所编译的正则表达式是否具有公共可见性。 Name&#xff1a;获取或设置用于所编译的正则表达式的类型名称。 Namespace&#xff1a…

DOCKER - 容器抓包

https://help.aliyun.com/knowledge_detail/40564.html?spma2c4e.11153940.blogcont272172.10.b09e28a6AOdITp#Linux http://man7.org/linux/man-pages/man1/nsenter.1.html?spma2c4e.11153940.blogcont272172.9.b09e28a6AOdITp [转]待整理 nsenter nsenter 包含在绝大部分 L…