rewrite URL重写,可以在改变网站结构后,无需要求客户端用户修改原有的浏览器书签,也无需其他网站修改对我们网站的友情链接,依赖于PCRE库的支持
1 if
语法: if (condition) { ... }
默认值: —
上下文: server, location
如果condition为真,执行定义在大括号中的rewrite模块指令。if指令会从上一层配置中继承配置
condition可以是下列任意一种:
• 变量名: 如果变量值为空或者为“0” 则条件为假;
• 使用“=”和“!=”运算符比较变量和字符串;
• 使用“~”(大小写敏感)和“~*”(大小写不敏感)运算符匹配变量和正则表达式。正则表达式可以包含匹配组,匹配结果后续可以使用变量$1..$9引用。如果正则表达式中包含字符“}”或者“;”,整个表达式应该被包含在单引号或双引号的引用中
• 使用“-f”和“!-f”运算符检查文件是否存在;
• 使用“-d”和“!-d”运算符检查目录是否存在;
• 使用“-e”和“!-e”运算符检查文件、目录或符号链接是否存在;
• 使用“-x”和“!-x”运算符检查可执行文件;
例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 last;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
2 rewrite
rewrite指令可以说是rewrite指令集中的核心指令,它通过正则表达式的使用改变URI
可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理
1.先执行server中的rewrite(如果有的话),得到新的URI, 只执行一次(无论修饰符是last还是break);
2.在location中匹配新的URI;
3.执行location中的rewrite(如果有的话), 如果修饰符是last,重写之后得到新的URI, 再在location中匹配新的URI; 如果修饰符是break,重写后得到新的URI,不再进行location匹配
语法: rewrite regex replacement [flag];
regex - 用于匹配URI的正则表达式。使用"()"标记要截取的内容
注意:
rewrite 接受到的URL不包含HOST地址和参数,因此regex不可能匹配到URI的HOST地址或参数
如:
请求的URL为http://myweb.com/source?arg1=value1&arg2=value2
此时rewrite指令接受到的URI 是 "/source", 而不包含"myweb.com",也不包含"?arg1=value1&arg2=value2"
replaement - 匹配成功后用于替换URI 中被截取内容的字符串
默认情况下,如果该字符串是由"http://" 或"https://" 开头的, 则不会继续对URI 进行处理,而是直接将重写后的URI返回给客户端。
flag - 有break、last、permanent、redirect
last - 停止执行当前这一轮的ngx_http_rewrite_module指令集,然后查找匹配改变后URI的新location;
break - 停止执行当前这一轮的ngx_http_rewrite_module指令集;
redirect - 返回状态码为302的临时重定向;
permanent - 返回状态码为301的永久重定向
注意:若last一直循环 则在循环十次后返回状态码为500的错误页面
例:
1.如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
2.如果query string中包含"post=140",则永久重定向到example.com
if ($args ~ post=140) {
rewrite ^ http://example.com/ permanent;
}