URL重写规则
开启mod_rewrite
开启mod_rewrite模块
使⽤URL重写功能,需要安装mod_rewrite模块。使⽤phpinfo()函数,到Apache Modules section部分,可以看到当前apache加载模块。
如果没有开启mod_rewrite, 就需要配置mod_rewrite.so的路径:
LoadModule rewrite_module modules/mod_rewrite.so
Apache2内置了mod_rewirte,在配置虚拟主机的配置⽂件VirtualHost部分打开引擎:RewriteEngine on
正则匹配等级域名网址这句之后就可以使⽤重写语法了。
VirtualHost⽂件部分的Directory配置必须是:
Options Includes FollowSymLinks #允许使⽤符号链接
AllowOverride All #允许⽬录配置⽂件.htaccess。如果不使⽤是AllowOverride None
利⽤mod_rewrite重写URL主要使⽤两个基本的指令RewriteRule和RewriteCond。
⼀个最常⽤的正则就是(.*)。它含有两个元素:⼀是“点”,表⽰任意字符;⼆是“星”,表⽰以前的全部字符。所以(.*)会匹配{REQUEST_URI}的所有字符。Rewrite重写引擎
的输⼊串是 {REQUEST_URI},也就是URL中出去域名以及“?”符号后的所有查询字符。
重定向的URL中要提取出“USA/California/San_Diego”,匹配模式正则表达式的原型是:
(.*)/(.*)/(.*)
以上正则,在{REQUEST_URI}中通过两个“/”的分割存储了三个值,为了解决我们具体问题,我们得加⼀点限制――毕竟,第⼀个和最后⼀个原⼦可以匹配任何字符。
开始,我们可以添加⼀些特殊的字符,⽐如表⽰正则“开始”或者“结束”,“^”字符表⽰正则的开始⽽“”表⽰正则的结束。(.∗)/(.∗)/(.∗)
{REQUEST_URI}是以“/”开头。Apache 在更改版本的时候会更改正则引擎,⼀代Apache要求有斜杠⽽⼆代Apache却不允许!但是我们可以⽤^/?(?表⽰匹配字符本⾝或者前
⼀个字符)来兼容两个版本的Apache。再加上对字符匹配的限制,最终匹配模式是:
^/?([a-zA-Z_]+)/([a-zA-Z_]+)/([a-zA-Z_]+)完整表⽰如下:RewriteEngineonRewriteRule/?([a−zA−Z]+)/([a−zA−Z]+)/([a−zA−Z]+) display.php?country=
1 &state=2&city=3[L]RewriteRule使⽤1到$9引⽤模式()中匹配的内容,称为反向引⽤。对于URL:
1=USA,2=California,$3=San_Diego
RewriteRule选项
“redirect|R[=code]” 强制重定向。经常引⽤到触发可见的定向。默认情况下它是⼀个HTTP 302的临时重定向,但是你可以注明具体的HTTP 代码,⽐如你可以⽤[R=301]来表明这
是⼀个永久重定向,这对搜索引擎抓取你重定向后的⽹页相当有⽤。
“proxy|P” 强制为代理
“forbidden|F” 403 禁⽌。告诉Apache响应请求时不提供页⾯。其原理就是Apache会发出⼀个403 HTTP相应,可以保护⽹站不被未经授权的或者其他盗链访问。
“nocase|NC” 忽略正则表达式中的⼤⼩写。它经常被⽤到{HTTP_HOST}服务器参数上,因为域名⾥⾯是不会区分⼤⼩写的。
“next|N” 回到第⼀条规则。可以让你的重写条件循环匹配,当你不知道{REQUEST_URI}有多少字符进⾏匹配的时候很有⽤。
“last|L” 最后⼀个规则。告诉Apache服务器⼀系列的条件或者是规则将在它出现后结束,换句话说就是[L]不出现,mod_rewrite将会⼀直执⾏。
“noescape|NE” 在输出中不对URI作转义。此标记阻⽌mod_rewrite对重写结果应⽤常规的URI转义规则。⼀般情况下,特殊字符(如‘%’, ‘
′,‘;′等)会被转义为等值的⼗六进制编码。此标记可以阻⽌这样的转义,以允许百分号等符号出现在输出中,如:RewriteRule/foo/(.∗)/ba 1 [R,NE]
可以使‘/foo/zed’转向到⼀个安全的请求‘/bar?arg=P1=zed’.
“skip|S=N” 跳过下⾯的N条规则。
RewriteCond指令
RewriteCond TestString CondPattern [Flags]
RewriteCond指令定义了⼀个规则的条件,即在⼀个RewriteRule指令之前有⼀个或多个RewriteCond指令。条件之后的重写规则仅在当前URI与pattern匹配并且符合这些条件的
时候才会起作⽤。
RewriteCond也有反向引⽤,但和RewriteRule中⽤$N引⽤不同,它使⽤%N反向引⽤。
RewriteCond引⽤Apache变量%{ NAME_OF_VARIABLE},如%{HTTP_HOST}。
RewriteCond的条件模式(CondPattern)除了使⽤perl样式正则表达式,还有额外的规则:
1. 使⽤‘!’ 字符(惊叹号)来实现匹配的反转
2. ‘,=。
3. ‘-d’ (是⼀个⽬录[directory])。将TestString视为⼀个路径名并测试它是否存在⽽且是⼀个⽬录.
4. ‘-f’ (是⼀个常规的⽂件[file])。将TestString视为⼀个路径名并测试它是否存在⽽且是⼀个常规的⽂件.
5. ‘-s’ (是⼀个⾮空的常规⽂件[size])。将TestString视为⼀个路径名并测试它是否存在⽽且是⼀个尺⼨⼤于0的常规的⽂件.
6. ‘-l’ (是⼀个符号连接[link])。将TestString视为⼀个路径名并测试它是否存在⽽且是⼀个符号连接.
7. ‘-F’ (对⼦请求有效的业已存在的⽂件)。测试TestString是否⼀个有效的⽂件,⽽且可以被服务器当前已经配置的所有存取控制所存取。它⽤⼀个内部⼦请求来做判断,由于会
降低服务器的性能,请⼩⼼使⽤!
RewriteCond选项
‘nocase|NC’ (no case)。它使测试忽略⼤⼩写。此标记仅作⽤于TestString和CondPattern的⽐较,⽽对⽂件系统和⼦请求的测试不起作⽤。
‘ornext|OR’ (or next condition)。它以OR⽅式组合若⼲规则的条件,⽽不是默认的AND。典型的例⼦如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule …some special stuff for any of these hosts…
如果不⽤这个标记,则必须使⽤三个条件/规则。
服务器变量
HTTP变量
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
mod_rewrite特殊值
API_VERSION, THE_REQUEST, REQUEST_URI, REQUEST_FILENAME
5. 如果⽂件不存在重定向到404页⾯
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule .? /404.php [L]
-f匹配的是存在的⽂件名,-d匹配的存在的路径名
6. 创建⽆⽂件后缀名链接
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^/?([a-zA-Z0-9]+)1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^/?([a-zA-Z0-9]+)1.html [L]
如果⽂件是以.php为后缀,这条规则将被执⾏。
推荐资源
正则表达式⼯具firefox扩展:Regular Expressions Tester
正则表Introduction to the Tutorial:
Apache⽂档之mod_rewrite介绍:
Apache⽂档之URL重写指南:
Learn Apache mod_rewrite: 13 Real-world Examples,原⽂:
Apache的Mod_rewrite 例⼦:
Processing math: 100%
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论