Web 技术研究所

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

nginx 配置之 rewrite 与 return 的跳转

  在 nginx 配置中如果想触发一个 3xx 重定向通常有两种方式。一种是使用 rewrite,后面接 redirect(302)或 permanent(301)。另一种是直接使用 return 返回一个 301 或 302 的状态码,并在第二个参数中带上一个 URL,它将自动被设置为响应头中的 Location 参数。
  这两种方式最大的一个特点就是 rewrite 后面接的 $uri 不需要 $args,因为 $args 会被自动带过来。而 return 的则会丢失 $args,需要手动补上 $args。另外,rewrite 对重定向的支持比较有限,如果服务器希望输出一个 307 之类的状态吗,那就只能通过 return 来实现了。
  我之前去踩过这个坑,写了个这样奇葩的配置。目的是让所有 80 端口的访问全部重定向到 https(默认走 443 端口)
server { listen 80; rewrite / https://$host$request_uri permanent; }   然而这个配置是有问题的!因为 $request_uri 这个参数是请求的原始 URI,也就是包含 $args 的。而 rewrite 指令本身有自带 $args,于是 $args 就被重复加了一次。比如请求「http://localhost/?a=1」想被 301 到「https://localhost/?a=1?a=1」。
  正确的写法应该是
server { listen 80; rewrite / https://$host$uri permanent; }   或者干脆使用 return 这么玩
server { listen 80; return 301 https://$host$request_uri; }   如果不需要考虑 SEO 的话,最好使用 307 状态码。因为 301 状态码无法正确处理 POST 请求,但是百度蜘蛛只认识 301 和 302,响应一个 307 状态码会让百度索引量掉底。
网名:
54.92.174.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^