Nginx中的return和rewrite是两种用于重定向请求的指令,但它们的使用场景和效果略有不同。

return指令

return指令用于将请求重定向到指定的URI或状态码,并且不会再进行后续处理。可以使用return指令实现如下几种重定向:

将请求重定向到指定的URL。

return 301 https://www.example.com/;

将请求重定向到同一服务中的某个URI。

return 302 /foo/bar.html;

将请求设置为指定的状态码。

return 404;

rewrite指令

rewrite指令用于对请求URI进行修改,并可选择将修改后的URI继续处理。通过rewrite指令,可以实现如下几种功能:

修改请求URI的内容

rewrite ^/old-uri$ /new-uri last;

修改请求URI并进行重新定向

rewrite ^/old-uri$ /new-uri permanent;

重写子请求的URI

location /foo { rewrite ^/(.*) /bar/$1 last; # 此处处理重写后的URI }

需要注意的是,rewrite指令在每个请求处理周期中最多执行10次。为了避免过多的重定向和无限循环,应谨慎使用rewrite指令,并始终测试重写规则。

return使用例子:

需求:帮助中心新老版本替换,访问老的的url等于/project/7/精确匹配,跳转到新的链接, 当访问链接中/project/7/a 带任何参数时都不跳转。 两种方式都一样:

location = /project/7/ {
  # 没有参数的情况
  if ($args = "") {
    return 301 https://www.new.com/help;
  }
  # 带参数的情况不跳转,保持当前URL
  proxy_pass http://upstream-new;
}
这个配置中,当匹配到location = /project/7/时,首先通过if语句判断是否有参数。
如果没有参数,则进行重定向到https://www.new.com/help,并返回301状态码;如果有参数,则不进行跳转,走原来的服务,即保持当前URL不变。
location = /project/7/ {
  # 带参数的情况
  if ($args != "") {
    # 不跳转,保持当前URL
    proxy_pass http://upstream-new;
  }
  # 没有参数的情况跳转重定向到新链接
  return 301 https://www.new.com/help;
}

如果匹配到带参数的URL,则不进行跳转,走原来的服务。如果没有参数的情况重定向跳转到新链接。