您的位置:首页 > 运维架构 > Apache

Apache的rewrite的重写相关的参数

2011-06-07 15:31 441 查看
重写规则的一般模式为下面的语法.
RewriteRule pattern target [Flag1,Flag2,Flag3]
RewriteRule 规则可以在后面添加标志(Flag), 可以又多个 flag, 多个 flag 用逗号"," 连接.

先说明一下一个比较特别的 target 值: "-", 如果目标是 "-" 的话, 那么被请求的URL不会被修改掉.

下面详细简介一下各个 flag 代表的意思.

C|chain

C|chain 意思: 字符 'C' 或者 字符串 'chain' 表示出了该行重写规则外还要有其他的重写规则, 相当于通常程序语言的 与符号
'&' , 如果第一条规则条匹配的话进行下一项条件匹配. 如果第一条或者中间一条匹配不成功. 在其后的都会被跳过.

CO|cookie

CO|cookie 意思: 字符 'CO' 或者 字符串 'cookie' 表示当某些特殊的规则被匹配到的时候, 允许设置一个COOKIE,
设置参数包含3个必须字段和2个可选字段.
三个必须的字段是设定COOKIE的名字, 值, 还有这个COOKIE的所属域名,
另外两个可选的字段是COOKIE的生存时间和路径.默认的COOKIE生存时间是浏览器的会话时间. 默认的路径是 '/', 针对整个网站.
实际的使用例子想下面这样
RewriteEngine On

# RewriteRule 匹配模式 -
[CO=COOKIE名称:COOKIE值:COOKIE域名:生存时间:路径] 各个参数用冒号:连接

RewriteRule ^/index.html -
[CO=mycookie:myCookieValue:.test.com:1440:/]

#RewriteRule ^/index.html
- [CO=mycookie:myCookieValue:.test.com] 或者省略后面的参数.
上面的规则的意思是在请求 index.html 文件的时候设置一个COOKIE值. COOKIE名是 mycookie,
值是:myCookieValue, 生效的域名是 .test.com, 生效时间是分钟计算的.
也就是生存时间是1天=24小时=1440分钟.

E|env

E|env 意思: 字符 'E' 或者 字符串 'env' 表示你可以设置一个环境变量. 注意一下变量在这个规则运行后生效.
看一个简单的例子, 就是apache在记录日志的时候不记录图片的读取记录. 那么下面的规则就有用了.
RewriteRule /.(png|gif|jpg) -
[E=image:1]

CustomLog
logs/access_log combined env=!image

F|forbidden

F|forbidden 意思: 字符 'F' 或者 字符串 'forbidden' 表示禁止访问.
Apache服务器会返回403禁止访问状态码给客户端.
下面的规则表示获取或者下载 exe程序文件是被显示禁止访问.
RewriteRule /.exe - [F]

G|gone

G|gone 意思: 字符 'G' 或者 字符串 'gone' 表示服务器响应状态码为:410 通常使用该标志的时候 target 目标值设置成
"-" 被请求的资源是有效的.
下面的例子表示旧的资源是有效的. 并且不在乎大小写.

RewriteRule
oldproduct - [G,NC]

H|handler

H|handler 意思: 字符 'H' 或者 字符串 'handler' 表示强制使用某类型处理程序处理被请求的资源.
比如请求一些不带后缀的文件的时候. 下面的列子表示当请求的URL里没有带'.'的时候, 强制使用PHP来处理这类的请求.
RewriteRule !/. -
[H=application/x-httpd-php]

L|last

L|last 意思: 字符 'L' 或者 字符串 'last'
表示当前规则是最后一条规则,停止分析以后规则的重写。该标志的使用频率非常高.
RewriteCond %{REQUEST_URI}
!index/.php

RewriteRule ^(.*)
index.php?req=$1 [L]

一定要注意的地方, 使用[L]标志的时候, 一定要注意你的匹配条件, 不会非常容易让你的重写规则陷入死循环, 比如你要定义页面所有页面请求都重写到一个
index.php 文件, 那么一定要注意在匹配条件时确定当请求的脚本不是index.php时才执行重写规则. 不然很明显当前页面请求的是 index.php,
当然 这个请求被重写到 index.php 然后index.php又被重写到index.php.. 这样反复执行. 页面会报错.
错误日志会记录报告你超出最大的重定向次数.

N|next

N|next 意思: 字符 'N' 或者 字符串 'next' 表示重新回到规则顶部重复执行. 一般在极端情况下用这个标志.
相当于一个while循环, 知道匹配失败时返回. 下面的例子表示把请求地址中的所有A字符替换成B字符.
RewriteRule (.*)A(.*) $1B$2

NC|nocase

NC|nocase 意思: 字符 'NC' 或者 字符串 'nocase' 表示请求的规则部分不区分大小写. 类似正则式里的/xxx/i
模式.
RewriteRule (.*/.(jpg|gif|png))$ http://images.test.com$1 [P,NC]

NE|noescape

NE|noescape 意思: 字符 'NE' 或者 字符串 'noescape' 表示不对URL中的特殊字符进行 hexcode
转码.看下面的例子:
RewriteRule ^/share/(.+) /goShare.html#$1
[NE,R]

上面的例子表示所有请求 /share/xxx.xx的请求都会被定向到/goShare.html文件上. 并且后面的部分作为一个#后面的值.
如果不加NE标志的话, #将被转义成 %23 这样就造成 404 错误了.

NS|nosubreq

NS|nosubreq 意思: 字符 'NS' 或者 字符串 'nosubreq'
表示只用于不是内部子请求.比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时,
Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。根据你的需要遵循以下原则:
如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

P|proxy

P|proxy 意思: 字符 'P' 或者 字符串 'proxy' 标志需要模块 mod_proxy 支持,
类似一个分发器网关的作用.比如网站的所有图片想用单独的一台服务器来运行. 那么先前的代码里的图片请求的时候, 直接定向到图片服务器去.
RewriteRule (.*)/.(jpg|gif|png) http://images.example.com$1.$2 [P]

使用[P]标志, 意味着使用了[L]标志, 因为使用该标志后马上就重定向到新地址了. 后面的重写规则会被忽略掉.

PT|passthrough

PT|passthrough 意思: 字符 'PT' 或者 字符串 'passthrough' 表示替换URL请问部分的地址.看例子
Alias /icons
/usr/local/apache/icons

RewriteRule
/pics/(.+)/.jpg /icons/$1.gif [PT]

当请求/pics/下的图片文件时, 实际是返回的是 /icons/目录下的同名文件. 需要注意的是一定要设置 [PT] 标志.
否则Alias设置无效.

QSA|qsappend

QSA|qsappend 意思: 字符 'QSA' 或者 字符串 'qsappend' 不怎么好表示. 看例子:
RewriteRule /pages/(.+) /page.php?page=$1
[QSA]

如果又标志: [QSA] 那么重写后的URL是: /page.php?page=123&one=two
如果没有[QSA]标志, 那么结果是: /page.php?page=123
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

R|redirect

R|redirect 意思: 字符 'R' 或者 字符串 'redirect' 表示进行重定向, 状态码在300-399里随机出, 默认是 302
重定向.通常和标志L一起使用. 使用模式: [R[=302]]

S|skip

T|type 意思: 字符 'S' 或者 字符串 'skip' 表示跳过执行下面的几个重写规则. 又点类似goto. 看下面的例子,
如果URL请求的文件不存在的话就跳过下面的两行重写规则.
# 请求的文件是否存在

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

# 不存在的情况

RewriteRule .? - [S=2]

RewriteRule (.*/.gif) images.php?$1

RewriteRule (.*/.html) docs.php?$1

T|type

T|type 意思: 字符 'T' 或者 字符串 'type' 表示为apache设置特定请求的响应类型. 也就是常说的 MIME
type,比如一个perl脚本. 希望给客户端显示文本源码, 那么可以这样做:
RewriteRule /.pl$ -
[T=text/plain]

或者你的服务器上的文件没有设置扩展名. 那么可以通知重写添加该文件的类型. 方便客户端显示.
RewriteRule IMG -
[T=image/jpg]

Apache的rewrite的重写相关的参数

Apache的rewrite的重写非常常用,现总结了一下.

Apache mod_rewrite规则重写的标志一览

R
[=code](force redirect) 强制外部重定向

强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

F
(force URL to be forbidden)禁用URL,返回403HTTP状态码。

G
(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

P
(force proxy) 强制使用代理转发。

L
(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

N
(next round) 重新从第一条规则开始运行重写过程。

C
(chained with next rule) 与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

T
=MIME-type(force MIME type) 强制MIME类型

NS
(used only if no internal sub-request) 只用于不是内部子请求

NC
(no case) 不区分大小写

QSA
(query string append) 追加请求字符串

NE
(no URI escaping of output) 不在输出转义特殊字符

例如:RewriteRule /foo/(.*) /bar?arg=P1/%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

PT
(pass through to next handler) 传递给下一个处理

例如:

RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理

Alias /def /ghi

S
=num(skip next rule(s)) 跳过num条规则

E
=VAR:VAL(set environment variable) 设置环境变量

使用mod_rewrite时常用的服务器变量:

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT

connection & request: REMOTE_ADDR, QUERY_STRING

server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL

system stuff: TIME_YEAR, TIME_MON, TIME_DAY

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)添加环境变量

实战

例子:

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]

RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

例子:

RewriteEngine On

RewriteBase /test

RewriteCond %{REQUEST_FILENAME}.php -f

RewriteRule ([^/]+)$ /test/$1.php

#for example: /test/admin => /test/admin.php

RewriteRule ([^/]+)/.html$ /test/$1.php [L]

#for example: /test/admin.html => /test/admin.php

限制目录只能显示图片

< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*/.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]
< /IfModule>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: