个人总结 nginx rewrite 规则中的 last 与 break

break和last的区别

  • last 停止当前这个URL匹配,使用rewrite后的URL,重新发起一个新的匹配,原浏览器URL不会跳转
  • break 相对last,break并不会使用新的 URL 重新匹配,只是跳出 break 所在的代码段,并执行location后续操作,原浏览器URL不会跳转
  • redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent 返回301永久重定向,浏览器地址栏显示跳转后的URL地址,Nginx返回response状态码301

例子说明和总结

代码一, break

location ~ /imgs/(.+\.(jpg|jpeg|png|bmp))$ {
  # 文件不存在先下载
  if (!-f $filename) {
    rewrite .* /cdn.php break;
    return 500;
  }
  
  return 501;
}

location / {
  return 502;
}

分析:(假设访问的链接是 /imgs/abc.jpg)

  1. 遇到 rewrite 规则,新的 url 变成 /cdn.php,但是浏览器不跳转还是 /imgs/abc.jpg;
  2. break 会跳出同级代码段,即 if 里面的代码段,所以 return 500; 不会执行;
  3. 跳出之后,按 /cdn.php 的规则,继续执行到 return 501;
  4. 最后会显示页面 501

代码二, last

location ~ /imgs/(.+\.(jpg|jpeg|png|bmp))$ {
  # 文件不存在先下载
  if (!-f $filename) {
    rewrite .* /cdn.php last;
    return 500;
  }

  return 501;
}

location / {
  return 502;
}

分析:

  1. 遇到 rewrite 规则,新的 url 变成 /cdn.php,但是浏览器不跳转还是 /imgs/abc.jpg;
  2. last 会按新 url /cdn.php 重头开始匹配,所以 return 500; 不会执行,同样后面的 return 501; 也就执行不了;
  3. 这时,新的 url /cdn.php 自然匹配不了 /imgs,所以只会最终匹配到 / 规则,执行到 return 502;
  4. 最后会显示页面 502

参考

最后修改:2022 年 05 月 26 日 01 : 49 PM

发表评论