# Rewrite
- break:停止执行该模块的指令集
- if:根据条件决定是否执行语句
- return: 返回一个状态值给客户端
- rewrite: 根据表达式来更改 url
- set:可以设置一个变量
# if 指令
if (condition) {
}
表达式只是一个变量时,值为""或任何以 0 开头的字符串都会当做 false
直接时使用=
或!=
正则表达式匹配,~区分大小写,~*不区分大小写的匹配,!~,!~表示不匹配
-f 和!-f 用来检测一个文件是否存在
-d 和!-d 用来检测一个目录是否存在
-e 和!-e 用来检测是否存在一个文件,一个目录或者一个符号链接
-x 和!-x 用来检测一个文件是否可执行
举例 只要携带 Safari 就不让授权
if ($http_user_agent ~ Safari) {
return 401;
}
下方是 Chrome 浏览器的 user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
# rewrite 指令
syntax: rewrite regex replacement [flag];
default:-
context:server, location,if
last 与 break
location / {
rewrite ^/code/ /test last;
return 403;
}
location /test {
return 500;
}
curl http://lcoalhost:9003/code/a
# 500
location / {
rewrite ^/code/ /test break;
return 403;
}
location /test {
return 500;
}
curl http://lcoalhost:9003/code/a
# 404
总结:last 跟 break 都能停止 rewrite 模块的指令集,但是 last 会继续匹配 location,break 就地终止
# 旧浏览器跳转
根据 user_agent 识别浏览器版本
map $http_user_agent $outdated {
default 0;
"~MSIE [1-11]\." 1;
"~Mozilla.*Firefox/[1-9]\." 1;
"~Mozilla.*Firefox/[0-2][0-9]\." 1;
"~Mozilla.*Firefox/3[0-1]\." 1;
"~Opera.*Version/[0-9]\." 1;
"~Opera.*Version/[0-1][0-9]\." 1;
"~Opera.*Version/2[0-1]\." 1;
"~AppleWebKit.*Version/[0-6]\..*Safari" 1;
"~Chrome/[0-9]\." 1;
"~Chrome/[0-2][0-9]\." 1;
"~Chrome/3[0-3]\." 1;
}
if ($outdated = 1){
rewrite ^ /outdated redirect;
}