rewrite 指令上下文

server、location、if

rewrite 语法

  1. rewrite regExp relacement [flag]

rewrite 语法说明(指令用途)

使用正则 regExp 来匹配请求 url,如果匹配成功,则使用 replacement 代替 url。
可使用 () 对请求 url 进行分组,方便在 replacement 提取。
如果 replacement 以 http://、https://、$scheme 开头,则停止处理后续内容,直接 302 重定向返回给客户端。

  1. location / {
  2. rewrite /test/(.*) http://$1.com;
  3. return 200 'ok';
  4. }

当访问 localhost:8080/test/baidu 时,不会执行 return 指令,而是直接(临时)重定向至 http://baidu.com;当访问 localhost:8080/abc 时,则响应 ok;

flag

rewrite 有四个 flag:

  1. last
    停止处理当前的 ngx_http_rewrite_module 的指令集,用 replacement 重新匹配 location;
  2. break
    停止处理当前的 ngx_http_rewrite_module 指令集;
  3. redirect
    返回 302 临时重定向。
  4. permanent
    返回 301 永久重定向。

last 和 break :都会终止 rewrite 上下文中后边的 ngx_http_rewrite_module 模块所包含的指令,但是 last 会重新发起一次 location 匹配,而 break 则不会。

  1. location / {
  2. rewrite ^/test1 /test2 break;
  3. rewrite ^/test2 /test3;
  4. }
  5. location /test2 {
  6. return 200 'test2';
  7. }
  8. location /test3 {
  9. return 200 'test3';
  10. }
  11. # 当发送请求:curl localhost:8080/test1 -I 时,返回 404 not found。

不携带 flag

没有 flag 选项是,多个 ngx_http_rewrite_module 模块的指令会顺序执行;
在最后一个 rewrite 对应的 replacement 发起 location 匹配。
**

  1. location / {
  2. rewrite ^/test1 /test2;
  3. rewrite ^/test2 /test3;
  4. }
  5. location /test2 {
  6. return 200 'test2';
  7. }
  8. location /test3 {
  9. return 200 'test3';
  10. }
  11. # 当发送请求:curl localhost:8080/test1 -I 时,返回 test3。
  1. location / {
  2. rewrite ^/test1 /test2;
  3. rewrite ^/test2 /test3;
  4. return 200 '200 ok';
  5. }
  6. location /test2 {
  7. return 200 'test2';
  8. }
  9. location /test3 {
  10. return 200 'test3';
  11. }
  12. # 当发送请求:curl localhost:8080/test1 -I 时,返回 200 ok。