规则介绍
RewriteEngine On|Off
RewriteEngine 用于开启或停用rewrite功能
RewriteBase URL-path
重定向URL路径,一般未写RewriteBase ’/’
RewriteCond TestString CondPattern [flags]
1、RewriteCond:
指令定义了一个规则的条件,即,在一个RewriteRule指令之前有一个或多个RewriteCond指令。
条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的时候才会起作用。
2、TestString:
是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
3、RewriteRule反向引用:
引用方法是 $N (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
4、RewriteCond反向引用:
引用方法是 %N (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
5、RewriteMap 扩展:
引用方法是 ${mapname:key|default}
6、服务器变量:
引用方法是 %{ NAME_OF_VARIABLE } 这个是我们最常使用到的功能
7、CondPattern:
是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.
可以在pattern串中使用!字符(惊叹号)来实现匹配的反转。
8、flags 参见下表
服务器变量NAME_OF_VARIABLE具体数值见下表:
HTTP_USER_AGENT //主要用于检测访问者系统和浏览器等
HTTP_REFERER //从哪个页面链接过来
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST //域名
HTTP_PROXY_CONNECTION
HTTP_ACCEPT
REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME
API_VERSION //这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。此模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。
THE_REQUEST //这是由浏览器发送给服务器的完整的HTTP请求行。(比如, “GET /index.html HTTP/1.1″). 它不包含任何浏览器发送的附加头信息。
REQUEST_URI //这是在HTTP请求行中所请求的资源。
REQUEST_FILENAME //这是与请求相匹配的完整的本地文件系统的文件路径名或描述.
IS_SUBREQ //如果正在处理的请求是一个子请求,它包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,有可能会产生子请求。
Flags
RewriteRule标记 |
含 义 |
描 述 |
R |
Redirect |
发出一个HTTP重定向 |
F |
Forbidden |
禁止对URL地址的存取 |
G |
Gone |
标记URL地址不存在 |
P |
Proxy |
将URL地址传递给mod_proxy |
L |
Last |
停止处理接下来的规则 |
N |
Next |
再次重第一个规则开始处理,但是使用当前重写后的URL地址 |
C |
Chain |
将当前的规则和紧随其后的规则链接起来 |
T |
Type |
强制执行指明的MIME类 |
NS |
Nosubreq |
只在没有任何内部子请求执行时运行本脚本 |
NC |
Nocase |
URL地址匹配对大小写不敏感 |
QSA |
Qsappend |
在新的URL地址后附加查询字符串部分,而不是替代 |
PT |
Passthrough |
将重写后的URL地址传递给另一个Apache模块进行进一步处理 |
S |
Skip |
忽略之后的规则 |
E |
Env |
设置环境变量 |
rewritecond的其他用法:
“-d”(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
“-f”(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
“-s”(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
“-l”(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
“-x”(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。该权限由操作系统检测。
“-F”(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
“-U”(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
举例:
1图片重定向:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^localhost$ //如果域名是localhost
RewriteCond %{REQUEST_FILENAME} !-f //并且访问的文件找不到
RewriteRule ^images/(.+) http://192.168.67.19/test/$1 [R=302,L] //则跳转到另一个域名下的另一个目录访问这个图片
2二级域名重定向到www.baidu.com
rewriteEngine on
rewriteCond %{http_host} ^baidu.com [NC]
rewriteRule ^(.*)$ http://www.baidu.com/$1 [R=301,L]
3设置404错误
RewriteEngine on
RewriteCond %{REQUEST_URI} !/test.html$ //如果请求的地址不是test.html
RewriteCond %{REMOTE_ADDR} !^192.168.67.19 //访问ip如果不是这个
RewriteRule $ /404.html [R=302,L] //则重定向到404.html这个升级提醒页面
4伪静态
RewriteEngine on
RewriteRule ^index.html$ index.php