nginx write 指令执行顺序执行 server 块的 rewrite 指令
进行 location 匹配
执行 location 块的 rewrite 指令
上述过程可能会嵌套、重复执行,如果 rewrite 次数达到 10 次,就会返回 500 Internal Server Error
break 指令
停止执行当前虚拟主机的后续 rewrite 指令集
如:
if ($slow) {
limit_rate 10k;
break;
}
if 指令
对给定条件 condition 进行判断,如果为真,则执行大括号内的 rewrite 指令
if (condition)
{
...
}
如:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
if ($request_method = POST) {
return 405;
}
if ($slow) {
limit_rate 10k;
}
if ($invalid_referer) {
return 403;
}
if 指令的 condition
if 指令的 condition 可以是下列中的任何内容:if 指令的 condition条件判断内容
变量如果变量值为空字符串或以 0 开始的字符串则为 false
=、!=比较一个变量和字符串是否相等
~、~*使用正则表达式匹配变量
-f、!-f检查一个文件是否存在
-d、!-d检查一个目录是否存在
-e、!-e检查一个文件、目录、符号链接是否存在
-x、!-x检查一个文件是否可执行
return 指令
用来停止处理并返回状态或 URL
return code;
return URL;
rewrite 指令
rewrite regex replacement [flag];
如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写
flag 取值如下:last -- 停止处理后续rewrite指令集,然后对当前重写的新URI重新进入 server 进行匹配
break -- 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行
redirect -- 如果replacement不是以http:// 或https://开始,返回302临时重定向
permant -- 返回301永久重定向
如:
server {
...
rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra last;
return 403;
...
}
如果在 rewrite 的 URL 最后加一个 ?,则说明在 rewrite 后去掉原请求的所有参数
rewrite ^/users/(.*)$ /show?user=$1? last;
set 指令
创建自定义变量
set variable value;
rewrite_log 指令
开启或关闭以notice级别打印rewrite处理日志到error log文件,可以出现在 main、server、location 配置的任何位置
rewrite_log on|off;
uninitialized_variable_warn 指令
控制是否输出为初始化的变量到日志
uninitialized_variable_warn on|off;