Nginx--rewrite

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;
    }
原文地址:https://www.cnblogs.com/Xinenhui/p/14130480.html