Web 技术研究所

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

3xx Location 到一个相对 URI?

  最近突然有让页面重定向到一个相对路径的需求,但又发现好像所有 3xx 的 HTTP 响应头中 Location 全都是绝对 URI?甚至连 nginx 的内部实现都会对 Location 做特殊处理,强行转换成绝对 URI。但是这显然没道理啊,为什么 Location 的取值就不能是相对 URI 呢?
  首先尝试在 nginx 中使用 return 指令,直接响应一个 301 重定向,并且使用相对路径:
location = /a { return 301 /b; }
  一开始以为是 nginx 的 Bug,翻了一波 nginx 源码后发现了一坨奇怪的代码。它在 header_filter 模块中莫名其妙地 hard code 了这个特性!于是我只能想到是不是 HTTP 规范就这样定义的了。
  翻开那亲切的 RFC 2616,结果里面对 Location 的定义也是日了狗的 absoluteURI!虽然规范这么说,但我还是觉得没道理!抱着「错不在我而是世界」的心态又去搜了一波,终于在 RFC 7231 中找到了对这块定义的重新修订,Location 定义为 absoluteURI 确实是没有道理的,它的取值应该是 URI-reference 才对!
  所以嘛,其实这还是 nginx 的锅!这个故事的教训是规范并不总是正确的,也并不总是讲道理的,不能光看一个规范!就像挖掘机技术也不是蓝翔一家说了算的一样!
网名:
54.226.58.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^