zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    Collections和Arrays常用方法
    集合(三)------双列集合
    集合(二)------单列集合
    集合(一)----------概述
    泛型
    线程
    Math类和Random类(数学公式相关类)
    时间相关的类
    Runtime类及其常用方法
    第65题:有效数字
  • 原文地址:https://www.cnblogs.com/Xinenhui/p/14130480.html
Copyright © 2011-2022 走看看