http 请求中的 origin 到底是大写还是小写 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xingyue
V2EX    问与答

http 请求中的 origin 到底是大写还是小写

  •  
  •   xingyue 2018-12-13 01:14:36 +08:00 4805 次点击
    这是一个创建于 2502 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题起因:

    用 node 写接口控制跨域的时候无意发现一个网站的请求头中的 origin 是小写的,而自己的 Origin 是大写的,同样都是 POST 请求。

    问题详细:

    大写的 Origin

    大写的 Origin

    小写的 origin

    小写的 origin


    我目前的认知是:origin 是浏览器在请求过程中自动加入请求头的,是不允许修改的。
    但是,为什么都是在 chrome 的屋檐下,会有不同的 origin/Origin


    尝试在页面请求中手动修改 Request Headers 中的 origin/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 的值,所以说是有着特定的容错(兼容)处理嘛?十分疑惑。


    刚入行半年萌新前端一枚,尝试搜索的很多关键字但是并没有找到答案,虽然是个很无聊的小问题但是真的太困扰了,望路过的大佬给指条路,十分感谢
    : )

    10 条回复    2018-12-13 13:45:08 +08:00
    wly19960911
        1
    wly19960911  
       2018-12-13 01:25:56 +08:00 via Android   2
    https://tools.ietf.org/html/rfc7230#section-3.2

    case-insensitive

    不区分大小写。
    weyou
        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.
    ysc3839
        3
    ysc3839  
       2018-12-13 01:36:44 +08:00 via Android   1
    Chrome 里面有不同的 header 可能是 HTTP 版本不同,HTTP 1.x 习惯首字母大写,HTTP/2 可能是为了减小体积全部转换成了小写。
    heimeil
        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 发布之后,会对头部进行压缩处理,对大小写敏感了,并推荐全小写,所以就出现了你的这两张对比图。
    xingyue
        5
    xingyue  
    OP
       2018-12-13 01:45:12 +08:00
    @wly19960911
    @weyou
    @ysc3839
    @heimeil
    感谢!我终于可以睡得着觉了!
    再次感谢!!!
    ysc3839
        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.
    msg7086
        7
    msg7086  
       2018-12-13 05:53:40 +08:00
    你贴的这两个都不是同一个协议来着……
    heimeil
        8
    heimeil  
       2018-12-13 10:01:21 +08:00   1
    @ysc3839 昨天睡前随便看了一下,看错了,应该是减小体积的作用,统一用小写,避免随意大小写产生冗余编码而导致字典过大。
    xingyue
        9
    xingyue  
    OP
       2018-12-13 13:11:13 +08:00
    @msg7086 说到协议两个字,我平常第一反应就是"http"/"https"/"ftp"等这一类的词,当时也想过会不会是 http 和 https 的区别,但是好巧不巧碰到了 HTTP1.1+SSL 的网站,他的 Origin 也是大写的,然后 chrome 调试台默认是不显示 HTTP 版本的,除非手动点击"view source",所以没想到问题出在 HTTP1.1 和 HTTP2 的差异上,,,主要还是自己太菜了 QAQ
    msg7086
        10
    msg7086  
       2018-12-13 13:45:08 +08:00
    @xingyue 嗯。
    话说以前 spdy 的时候就已经用小写通信了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2813 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 13:28 PVG 21:28 LAX 06:28 JFK 09:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86