见好多同事都会写正则。那个羡慕嫉妒恨的。于是乎。。我也决定学了,这篇都是从别人上面捡着有用的copy下来的。算是自己总结的吧! (更新中。。)
URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程
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
Rewrite规则表达式的说明:
. 匹配任何单字符
[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适用的标志符
“(.*)”含有两个元素:一是“点”,表示任意字符;二是“星”,表示以前的全部字符。所以(.*)会匹配{REQUEST_URI}的所有字符。
“/”表示分隔。
“^”字符表示正则的开始而“$”表示正则的结束。
“_” 表示允许有空格。
“[]”中括弧明确我们匹配的正则。
“[chars]”字符类: "chars"中的任意一个字符。
“[^chars]” 字符类: 不在"chars"中的字符。
“text1|text2” 选择: text1 或 text2。
“-”表示连接的范围。如[a-z]。
“+”来匹配在该字符之前的一个或者多个字符,避免匹配到空。
^/?(?表示匹配字符本身或者前一个字符) 正则开头。为兼容两个版本这样写
“?”前面的字符出现 0 或 1 次。
{HTTP_HOST}是一个Apache服务器变量,必须加一个“%”字符再之前,常在RewirteCond中出现。
“!”开始表示如果正则不匹配那么条件成立。
“\”转义字符,将其作为一个普通字面字符而不是表示所有字符。比如对".[]()"进行转义,等等
“.”任意一个字符
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
例子:
- T规则:
- RewriteRule ^user/(w+)/?$ user.php?id=$1
- 匹配模式:
- ^ 输入的开头
- user/ 以“user/“开始的请求地址
- (w+) 提取所有的字母,并将提取的结果传给$1
- /? 可选的斜线 "/"
- $ 输入结束
- 替换为:
- user.php?id= 要用到的字符串.
- $1 上面第一个提取到的字符串。
转载于:https://blog.51cto.com/linuxan/663544