用 node 写接口控制跨域的时候无意发现一个网站的请求头中的 origin 是小写的,而自己的 Origin 是大写的,同样都是 POST 请求。
我目前的认知是:origin 是浏览器在请求过程中自动加入请求头的,是不允许修改的。
但是,为什么都是在 chrome 的屋檐下,会有不同的 origin/Origin
尝试在页面请求中手动修改 Request Headers 中的 origin/Origin,结果符合预期,被浏览器给拦截了
//环境 node10+express4,在请求中打印如下信息
console.log(Object.keys(req.headers));
console.log(`从 req.headers 中直接获取:小写的 origin:${req.headers.origin}-----大写的 Origin:${req.headers.Origin}`);
console.log(`使用 req.set 方法获取:小写的 origin:${req.get('origin')}-----大写的 Orgin:${req.get('Origin')}`);
代码图片貌似更方便看,附上:
在 node 服务端拿到的 header 对象中,origin 的键值就是小写的,使用大写的键 Origin 是取不到值的。但是使用 express 中的 req.set 方法(该方法专门用来获取请求头中的指定值),小写的 origin 和大写的 Origin 都是可以正确获取到 origin 的值,所以说是有着特定的容错(兼容)处理嘛?十分疑惑。
刚入行半年萌新前端一枚,尝试搜索的很多关键字但是并没有找到答案,虽然是个很无聊的小问题但是真的太困扰了,望路过的大佬给指条路,十分感谢
: )
1
wly19960911 2018-12-13 01:25:56 +08:00 via Android 2
|
2
weyou 2018-12-13 01:28:48 +08:00 via Android 1
From RFC2616: Each header field consists of a name followed by a colon (":") and the field value. Field names are case-insensitive.
|
3
ysc3839 2018-12-13 01:36:44 +08:00 via Android 1
Chrome 里面有不同的 header 可能是 HTTP 版本不同,HTTP 1.x 习惯首字母大写,HTTP/2 可能是为了减小体积全部转换成了小写。
|
4
heimeil 2018-12-13 01:40:46 +08:00 1
https://github.com/expressjs/express/blob/master/lib/request.js#L74
你的两个例子,一个是 HTTP/1.1,一个是 HTTP/2,之前的头风格都是首字母大写然后用中划线分割,好像很多都是 express 这种处理方式,直接全转小写,HTTP/2 发布之后,会对头部进行压缩处理,对大小写敏感了,并推荐全小写,所以就出现了你的这两张对比图。 |
5
xingyue OP |
6
ysc3839 2018-12-13 01:51:37 +08:00 via Android 1
@heimeil HTTP/2 是必须小写。
https://tools.ietf.org/html/rfc7540#section-8.1.2 > Just as in HTTP/1.x, header field names are strings of ASCII characters that are compared in a case-insensitive fashion. However, header field names MUST be converted to lowercase prior to their encoding in HTTP/2. A request or response containing uppercase header field names MUST be treated as malformed. |
7
msg7086 2018-12-13 05:53:40 +08:00
你贴的这两个都不是同一个协议来着……
|
8
heimeil 2018-12-13 10:01:21 +08:00 1
@ysc3839 昨天睡前随便看了一下,看错了,应该是减小体积的作用,统一用小写,避免随意大小写产生冗余编码而导致字典过大。
|