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属性(httpd.conf中的Option FollowSymLinks)且在.htaccess里要声明RewriteEngine on。

2. Apache mod_rewrite规则中的标记含义

==常用变量:

详细变量介绍,查看>>Apache Rewrite服务器常用变量汇总

%{QUERY_STRING} URL参数(Query String)是URL里面“?”后面的部分,它通常用于传输参数给CGI脚本或者其它动态页面。在Apache中,该值存储在环境变量QUERY_STRING中(在PHP中,可以通过$_SERVER['QUERY_STRING']访问到),是Apache定义的“变量=值”向量(数组)。 在Apache中,大多对URL进行操作的指令,如、Redirect、Alias和RewriteRule,都不能直接访问该数据;不过,mod_rewrite模块却可以对URL参数进行添加、删除和修改。其中的关键就是使用RewriteCond来匹配%{QUERY_STRING}变量,如果需要的话,还可以使用[QSA]标志来附加URL参数。

%1、%2…%n 是反向引用,来自之前的RewriteCond中正则表达式的匹配结果

%{HTTP_HOST} 保存主机头信息,也就是当前访问的域名,即“http://”和之后第一个“/”之间的内容。如果访问地址是http://www.mrdede.com/aaa,则%{HTTP_HOST}=www.mrdede.com;如果访问http://cdn.www.mrdede.com/,%{HTTP_HOST}=cdn.www.mrdede.com

%{SERVER_PORT} 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值

httpd.conf配置如下:

客户端访问域名www.mrdede.com
%{HTTP_HOST} = www.mrdede.com
%{SERVER_NAME} = mrdede.com
所以,在实际程序中,应尽量使用%{HTTP_HOST} ,比较保险和可靠。

%{SERVER_PORT} 端口号

%{REQUEST_URI} 假设访问地址为http://mrdede.com/aaa/index.php?b=1&c=2,则%{REQUEST_URI}的值是http://mrdede.com后面包含正斜杠“/”在内的内容,即%{REQUEST_URI}=/aaa/index.php?b=1&c=2

%{HTTP_USER_AGENT} 是User-agent信息

 

==指令:

RewriteBase 定义了重写基准目录。

  • 例如,如果你将虚拟站点设置在/var/www目录下,删除这行将会导致重定向到http://mrdede.com/var/www/1.php。显然这是找不到的,而且你也不会希望用户看见你的服务器的目录结构。
  • 再举个例子,如果RewriteBase /base/,那么将会重定向到http://mrdede.com/base/1.php。

 

3.目录级(.htaccess)实例说明

例一、下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.mrdede.cn和70.40.213.183都跳转到主机前缀为http://www.mrdede.cn,避免相同内容的网页有多个指向的域名,如http://mrdede.cn。

例二、将输入 en.aaa.com 的域名时跳转到www.aaa.com

例三、近期更换了域名,新域名为www.aaa.com, 更加简短好记。这时需要将原来的域名ss.mrdede.cn, 以及论坛所在地址ss.mrdede.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.mrdede.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.aaa.com/tread-60.html,而其他网页,如原先的http://ss.mrdede.cn/purchase不会到二级域名bbs.aaa.com/purchase上,而是到www.aaa.com/purchase

按照这样的要求重定向规则应该这样写:

例四、同时达到下面两个要求:

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 的功能

例五、比较常用的规则

/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html

例六、使用Apache的URL Rewrite配置多用户虚拟服务器

要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.mrdede.us和 *.mrdede.cn全部解析到了我的IP地址70.40.213.183上。

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

在这段设定中,我把*.mrdede.cn和*.mrdede.us 的Document Root都设定到了 /home/www/www.mrdede.us

继续看下去,在这里我就配置了URL Rewrite规则。

 

设置后重启Apache服务器就大功告成了!

例七、Rewrite 防盗链正则,不允许www.baidu.com和www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链.

例八、通过URL参数进行访问控制

如果 http://mrdede.com/page?var=val 中的 var=val 包含字符串 foo ,则禁止访问。

例九删除URL参数

将URL参数直接从URL中删除。

例十增加URL参数

通过[QSA]标志保留原有URL参数的同时,在后面增加新的URL参数:var=val。

例十一重写某些URL参数

当URL参数包含字符串val时,将URL:http://mrdede.com/page1?var=val 重写为:http://mrdede.com/page2?var=val 。

注意,在这里如果你不修改URL参数的话,不需要使用[QSA]标志,原来的URL参数是默认附加的。

例十二、修改URL参数

当访问 /path 时,将字符串 val 修改为 other_val 。

上面的%1和%2是反向引用,来自之前的RewriteCond中正则表达式的匹配结果。

例十三、将URL参数转换为路径

将URL:http://mrdede.com/path?var=val 转换为: http://mrdede.com/path/var/val 。

注意上面的转换仅用于单一的 var=val 参数,且其中只能包含字母、数字和下划线。

例十四、将路径转换为URL参数

这是上面的转换的反向操作。这个例子可以转换有效的任意三级路径的URL: http://mrdede.com/path/var/val 将转换为 http://mrdede.com/path?var=val 。

例十五、利用QSA转换查询字符串QUERY_STRING

QSA标志( Query String Appending)用于在URI中截取查询字符串,这个截取操作是通过小括号正则表达式实现的:

将会把请求/pages/123?one=two 映射到 /page.php?page=123&one=two
注意粗体部分几乎是相同的,除了“问号”变成了“与”符号
如果没有QSA标志,那么会映射到/page.php?page=123。
如果没有用到小括号正则表达式,就不需要QSA。
小括号正则表达式可以截取查询字符串中的内容,但是如果没有开启QSA标志,那么在/page.php?page=$1中“问号”之后将会被剥离丢弃。这种特性可以用于实现“剥离查询字符串”。
通过QSA,我们可以将简单链接/simple/flat/link/ 映射成 server-side.php?first-var=flat&second-var=link

例十六、利用RewriteCond改写查询字符串QUERY_STRING

该规则将访问请求http://mysite/grab?foo=bar转换为http://mysite/page.php?bar=bar
RewriteCond用于捕获查询字符串(QUERY_STRING)中变量foo的值,并存储在%1中
QUERY_STRING是Apache定义的“变量=值”向量(数组)

例十七、QSA与RewriteCond双剑齐发

会把/grab/foobar.zip?level=5&foo=bar 映射到 /bar/index.php?file=foobar.zip&level=5&foo=bar
转换后根目录是bar目录
foobar.zip?level=5中的“问号”变成了foobar.zip&level=5中的“与”符号

例十八、301重定向:去掉www

例十九、301重定向:加上www

例二十、限制某些User-agent的访问

该规则限制“迅雷”客户端下载资源,并将下载文件重置到abuse.txt
HTTP_USER_AGENT 是Apache的内置变量
2.0.50727是迅雷User-agent的特征字符串
RewriteRule后面的“点”表示“任意URI”,也就是不管请求的是什么,都输出abuse.txt
通常,我们不会仅限制一个UA。利用[OR]即可实现对多个UA作出统一处理:

例二十一、用.htaccess阻止盗链图片

解释:除本站以外其他网站都不得引用本站图片,
即:如果引用站点为“空”或者是“本站”,或者,所引用对象是“hotlink.png”,那么就允许访问
提醒:RewriteCond之间默认的逻辑连接词是逻辑“与”

 

 

4.服务器级(httpd.conf)实例

例一、兼容网站 mrdede.com、work.mrdede.com、admin.mrdede.com 全部指向同一个目录程序#

实现:
#如果是mrdede.com 访问,直接跳转到 www.mrdede.com/$1
#如果是my.mrdede.com、test.mrdede.com 不跳转
#如果是localhost、192.168.*.*、loc、devwww本地测试的环境,不跳转
#其他全部跳转

百度云服务器之Nginx环境下伪静态配置

Windows主机IIS7开启伪静态功能Rewite

 

承接各种网站开发与修改、爬虫、数据采集分析、小程序等任务

Html+Css+JS+PHP+Nodejs+Python

专治网站各种不服

一起探讨,互相学习,共同进步!有事儿您说话。

This entry was posted in Apache and tagged , , by 织梦先生. Bookmark the permalink.