nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录。

可以在 http 域中打开 rewrite 日志:

rewrite_log on; # 打开rewrite-log,开启时error——log中记录notice级别的重写日志


Rewrite 可以出现在四个地方

  1. server 域中的任何地方;
  2. server 域中的 if 配置中;
  3. location 域中的任何地方;
  4. location 域中的 if 配置中;

Rewrite 标志位总共有5种

redirect/permanent/break/last/留空;


server 域中的 rewrite

优先级: 优先执行 rewrite 部分,然后再去匹配 location 块 (不论 rewrite 的位置在 location 前还是后)

break/last/留空

server 域中 break/last/留空 作用相同,都会去匹配 location,建议留空

    server {
        location ^~ /rewrite1 {
          echo "rewrite1 page";
        }
        rewrite ^/origin1(.*) /rewrite1$1; #last/break/留空 作用相同
     }

     # http://127.0.0.1/origin1 输出 rewrite1 page
     # 不论 rewrite 在 location 之前还是之后,输出结果相同

redirect/permanent

参考 location 中的 redirect/permanent


location 域中的 rewrite

break

直接使用当前资源,执行 location 里余下的语句,完成本次请求,地址栏url不变;

    server {
        location ^~ /origin2 {
          rewrite ^/origin2(.*) /rewrite2$1 break;
          echo "origin2 page";
        }
        location ^~ /rewrite2 {
          echo "rewrite2 page";
        }
      }

      # http://127.0.0.1/origin2  输出 origin2 page
      # 如果 location 中 rewrite 后是对静态资源的请求,不需要再进行其他匹配,一般要使用break

      # /origin2/里的echo 指令注释的情况下,然后再次访问/origin2/xx会报404,尝试找/rewrite2/xx这个html页面并输出内容,
        事实上,这个页面不存在,所以会报404的错误

last 与 留空

发起一个新请求,再次进入server块,重试location匹配,超过10次匹配不到报500错误,地址栏url不变;

     server {
         location ^~ /origin3 {
          rewrite ^/origin3(.*) /rewrite3$1 last; # last与留空作用相同
          echo "origin3 page";
        }
        location ^~ /rewrite3 {
          echo "rewrite3 page";
        }
     }

     # http://127.0.0.1/origin3  输出 rewrite3 page
     # last 与 留空 都输出 rewrite3 page

redirect

返回302临时重定向,地址栏显示重定向后的url,爬虫不会更新url(因为是临时)

   server {
        location ^~ /origin4 {
          rewrite ^/origin4(.*) /rewrite4$1 redirect;
        }
        location ^~ /rewrite4 {
          echo "302 redirect page";
        }
   }

   # http://127.0.0.1/origin4 302 redirect page
   # 同时地址栏的 url 变为 http://127.0.0.1/rewrite4
   # 爬虫不会更新 url

permanent

返回301永久重定向, 地址栏显示重定向后的url,爬虫更新url

   server {
        location ^~ /origin5 {
          rewrite ^/origin5(.*) /rewrite5$1 permanent;
        }
        location ^~ /rewrite5 {
          echo "301 permanent page";
        }
    }

    # http://127.0.0.1/origin5    301 permanent page
    # 同时地址栏的 url 变为 http://127.0.0.1/rewrite5
    # 爬虫更新url

alias 中 rewrite

    server {
        location ^~ /static {
          alias /home/www.test.com/static/;
          rewrite ^/static(.*) /test$1 last; 
        }

        location ^~ /test {
          echo "test page";
        }

        #http://120.27.105.225/static/abc        last  ->  test page
        #http://120.27.105.225/static/abc        break ->  test page 500 Internal Server Error
        #???http://120.27.105.225/static/a.gif         -> /test/a.gif
    }

        #使用alias指定源:必须使用last
        # 如果location中rewrite后是对静态资源的请求,不需要再进行其他匹配,一般要使用break或不写

break

语法:break; 作用域:server,location,if

停止执行当前虚拟主机的后续rewrite指令集, break指令实例:

if ($slow) {
limit_rate 10k;
break;
}

results matching ""

    No results matching ""