Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nginx 配置之 漫无止境的 rewrite

  rewrite 是 nginx 配置中最常用的指令之一,它通常用于匹配并修改 $uri。但除此之外,rewrite 结束后默认会重新进入一次规则匹配,直到没有任何规则可以匹配才开始从 root 中查找文件。于是,如果 rewrite 可以匹配自身目标,而且没有 break 的话就会进入死循环。
  比如现在有这样一个需求,无论什么路由访问都响应 /index.html 这个文件。于是有些人可能会这样写配置
location / { rewrite / /index.html; }   看似逻辑没问题吧?「location /」是匹配所有以「/」开头的路径也就是所有路由,并且 rewrite 到 /index.html 上。但是这个配置是无法使用的,它始终是 500。这就是因为 rewrite 的重新匹配机制被忽略了。当 rewrite 执行成功后,$uri 变成了 /index.html,然后重新进入 location 匹配。此时 /index.html 依然可以被「location /」这个规则匹配,所以又再次被 rewrite,如此就卡在这儿了。
  解决这个问题可以让 /index.html 这条路由不再 rewrite,比如这么写: location /index.html {} location / { rewrite / /index.html; }   但我更推荐使用 break 指令,它可以让 rewrite 不再进入匹配,直接从 root 查找文件。 location / { rewrite / /index.html; break; }   或者也可以写成 location / { rewrite / /index.html break; }   甚至这种场景可以直接不用 rewrite,改用 try_files location / { try_files /index.html =404; }
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^