rewrite 指令上下文
server、location、if
rewrite 语法
rewrite regExp relacement [flag]
rewrite 语法说明(指令用途)
使用正则 regExp 来匹配请求 url,如果匹配成功,则使用 replacement 代替 url。
可使用 () 对请求 url 进行分组,方便在 replacement 提取。
如果 replacement 以 http://、https://、$scheme 开头,则停止处理后续内容,直接 302 重定向返回给客户端。
location / {
rewrite /test/(.*) http://$1.com;
return 200 'ok';
}
当访问 localhost:8080/test/baidu 时,不会执行 return 指令,而是直接(临时)重定向至 http://baidu.com;当访问 localhost:8080/abc 时,则响应 ok;
flag
rewrite 有四个 flag:
- last
停止处理当前的 ngx_http_rewrite_module 的指令集,用 replacement 重新匹配 location; - break
停止处理当前的 ngx_http_rewrite_module 指令集; - redirect
返回 302 临时重定向。 - permanent
返回 301 永久重定向。
last 和 break :都会终止 rewrite 上下文中后边的 ngx_http_rewrite_module 模块所包含的指令,但是 last 会重新发起一次 location 匹配,而 break 则不会。
location / {
rewrite ^/test1 /test2 break;
rewrite ^/test2 /test3;
}
location /test2 {
return 200 'test2';
}
location /test3 {
return 200 'test3';
}
# 当发送请求:curl localhost:8080/test1 -I 时,返回 404 not found。
不携带 flag
没有 flag 选项是,多个 ngx_http_rewrite_module 模块的指令会顺序执行;
在最后一个 rewrite 对应的 replacement 发起 location 匹配。
**
location / {
rewrite ^/test1 /test2;
rewrite ^/test2 /test3;
}
location /test2 {
return 200 'test2';
}
location /test3 {
return 200 'test3';
}
# 当发送请求:curl localhost:8080/test1 -I 时,返回 test3。
location / {
rewrite ^/test1 /test2;
rewrite ^/test2 /test3;
return 200 '200 ok';
}
location /test2 {
return 200 'test2';
}
location /test3 {
return 200 'test3';
}
# 当发送请求:curl localhost:8080/test1 -I 时,返回 200 ok。