return和rewrite均可以用于重定向,return指令用起来更加简单,而rewrite指令可以用于更复杂的需求,并且Nginx官方也更建议使用return
return 指令
return
指令会直接告诉Nginx停止处理请求并立即向客户端发送状态码(例如,301永久重定向)和重写的URL,
return (301 | 302 | 303 | 307) url;
比如我们常用的将http流量重定向到https:
return 301 https://$server_name$request_uri;
- 也可以用于向客户端返回指定的响应内容
return (1xx | 2xx | 4xx | 5xx) ["text"];
例如:
return 401 "Access denied because token is expired or invalid";
rewrite指令
rewrite指令语法:
rewrite regex replacement [flag];
regex
是正则表达式,用于匹配uri或url
replacement
是重写的uri或url,如果replacement
字段是以http://
,https://
或者$scheme
开始,将不再继续处理,并将重定向返回给客户端
flag
用于控制是否继续执行后续的rewrite指令(rewrite指令默认会按照在配置文件中出现的顺序依次执行):
last
:停止处理后续的rewrite指令集,并开始寻找能够匹配重写后的新uri的locationbreak
:停止处理后续的rewrite指令集,并不再继续查找匹配redirect
:如果replacement不是以http://
,https://
或者$scheme
开始,则返回302临时重定向状态码permanent
:返回301永久重定向状态码
有关break
和last
这两个可选参数的差异和详细解读:
break
和last
参数放在rewrite
指令后,无论如何一定会产生使这条rewrite
指令之后的rewrite
指令无效的效果在
location
块外使用break
或last
,对rewrite
指令造成的效果一样,除了第一条的打断效果外,都会让rewrite
指令的结果进入搜寻适配的location
块的阶段在
location
块内使用break
,打断rewrite
指令流后,继续执行当前location
块中的其它(模块的)任务,不会匹配新的location
在
location
块内使用last
,打断rewrite
指令流后,会以rewrite
指令的结果为新被适配者去搜寻自己合适的location
块并进入,rewrite
指令所在的location
块内其它(模块的)任务被放弃,但不会受外部rewrite
指令的影响参考文章:
nginx的rewrite指令的可选参数break和last的差异
rewrite - nginx url rewriting: difference between break and last
rewrite指令示例:
location = /nginx {
rewrite ^/nginx?$ /music last;
}
location = /nginx {
rewrite ^/nginx?$ /movies break;
}
server {
rewrite ^ $scheme://$server_name$request_uri permanent;
}
location ~ ^/mesh {
rewrite ^/mesh http://test.com/ permanent;
}
location = /test.php {
rewrite ^/test.php?id=([0-9]+)$ /user/$1 last; # $1表示正则表达式中第一个括号的值
}
location ~ /([0-9]+)/(.*)$ {
rewrite /([0-9]+)/(.*)$ /$2 break;
proxy_pass http://127.0.0.1:9090;
}