# 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;
}