apache的rewrite功能

关于深层次的介绍看这个吧。
http://blog.csdn.net/miklechun/article/details/43667575

一、rewrite简介

apache的rewrite模块很强大,我看了点资料,就写下,慢慢加深理解。

二、APache配置Rewrite(windows下)

服务器级别:
1.打开配置文件httpd.conf,找到LoadModule rewrite_module modules/mod_rewrite这一行,把前面注释去掉
2.在httpd.conf中添加如下代码

<IfModule mod_rewrite.c> 
RewriteEngine On 
#这里编写rewrite规则,具体语法,下面会详细描述
</IfModule> 

3.重启apache就可以了。

目录级(.htaccess):

1.打开Apache的配置文件httpd.conf,将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉;
2.让Apache支持.htaccess,需要将httpd.conf中的

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

修改为:

<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>

3.创建.htaccess,创建方法为用记事本打开点击文件–另存为,在文件名窗口输入“.htaccess”,一定要加上“.”。将创建的.htaccess拷贝到网站程序的根目录下即可。
4.htaccess中的内容如下:

<IfModule mod_rewrite.c> 
RewriteEngine On 
#这里编写rewrite规则,具体语法,下面会详细描述
</IfModule> 

三、规则

RewriteCond 与 RewriteRule

学习Rewrite只需要重点了解他的三个核心就可以:RewriteEngine,RewriteCond,RewriteRule。
RewriteEngine

这个是rewrite功能的总开关,用来开启是否启动url rewrite

RewriteEngine on

RewriteCond

RewriteCond就是一个过滤条件,简单来说,当URL满足RewriteCond配置的条件的情况,就会执行RewriteCond下面紧邻的RewriteRule语句。

RewriteCond的格式如下:
RewriteCond %{待测试项目} 正则表达式条件

RewriteRule规则表达式的说明:

. 匹配任何单字符
[chars] 匹配字符串:chars
[^chars] 不匹配字符串:chars
text1|text2 可选择的字符串:text1或text2
? 匹配0到1个字符
* 匹配0到多个字符
+ 匹配1到多个字符
^ 字符串开始标志
$ 字符串结束标志
n 转义符标志

反向引用 $N 用于 RewriteRule 中匹配的变量调用(0 <= N <= 9)
反向引用 %N 用于 RewriteCond 中最后一个匹配的变量调用(1 <= N <= 9)

RewriteCond适用的标志符

‘nocase|NC’ (no case)忽略大小
‘ornext|OR’ (or next condition)逻辑或,可以同时匹配多个RewriteCond条件

RewriteRule适用的标志符

‘redirect|R [=code]’ (force redirect)强迫重写为基于http开头的外部转向(注意URL的变化) 如:[R=301,L]
‘forbidden|F’ (force URL to be forbidden)重写为禁止访问
‘proxy|P’ (force proxy)重写为通过代理访问的http路径
‘last|L’ (last rule)最后的重写规则标志,如果匹配,不再执行以后的规则
‘next|N’ (next round)循环同一个规则,直到不能满足匹配
‘chain|C’ (chained with next rule)如果匹配该规则,则继续下面的有Chain标志的规则。
‘type|T=MIME-type’ (force MIME type)指定MIME类型
‘nosubreq|NS’ (used only if no internal sub-request)如果是内部子请求则跳过
‘nocase|NC’ (no case)忽略大小
‘qsappend|QSA’ (query string append)附加查询字符串
‘noescape|NE’ (no URI escaping of output)禁止URL中的字符自动转义成%[0-9]+的形式。
‘passthrough|PT’ (pass through to next handler)将重写结果运用于mod_alias
’skip|S=num’ (skip next rule(s))跳过下面几个规则
‘env|E=VAR:VAL’ (set environment variable)添加环境变量

四、实例

例子1: 所有请求都定向到 index.php 脚本, 注意要排除 index.php 本身. 比如就进入死循环了.

RewriteRule !^index\.php$ index.php [L]

例子2: 当请求不存在的资源时, 统一定义到根目录下的 404.html

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [L]

例子3: 限制访问. 比如来自一些不友好的网站连接过来的请求. 不允许访问. 下例中如果

HTTP_REFERER 中包含 sex 字符, 则不允许访问.
RewriteCond %{HTTP_REFERER} sex
RewriteRule ^.*$ - [F]

例子4: 按照时间显示不同的页面, 比如访问 hello.html 页面时. 如果 在 8:00-19:00 的时候访问. 显示 hello.day.html 其他时间访问显示: hello.night.html

RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^hello\.html$ hello.day.html
RewriteRule ^hello\.html$ hello.night.html

例子5: 伪静态化, 比如访问 /user20.html 则调用viewUser.php 显示用户ID为20的用户资料

RewriteRule ^user([0-9]*)\.html$ viewUser.php?userid=$1

例子6: 喜欢用二级域名的比较实用了. 比如网站目录下有 user, upload 等几个目录, 可以通过 http://www.test.com/user 这样的模式访问. 但是如果想做成统一用二级域名模式访问: http://user.test.com , 但是不允许 http://www.test.com/user 这样访问. 那么就像下面这样来限制.

RewriteCond %{REQUEST_URI} ^/user
RewriteRule ^.*$ http://user.test.NET" [L]

参考链接

参考链接1
参考链接2
参考链接3

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值