Nginx中的return和rewrite重定向

关于Nginx重定向配置

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指令默认会按照在配置文件中出现的顺序依次执行):

    1. last:停止处理后续的rewrite指令集,并开始寻找能够匹配重写后的新uri的location
    2. break:停止处理后续的rewrite指令集,并不再继续查找匹配
    3. redirect:如果replacement不是以http://https://或者$scheme开始,则返回302临时重定向状态码
    4. permanent:返回301永久重定向状态码

有关breaklast这两个可选参数的差异和详细解读:

  • breaklast参数放在rewrite指令后,无论如何一定会产生使这条rewrite指令之后的rewrite指令无效的效果

  • location块外使用breaklast,对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;
} 
发表了43篇文章 · 总计78.96k字
·
Built with Hugo
主题 StackJimmy 设计