当心这我的,他又在文末发招人广告了!前端
Nginx作反向代理的时候,咱们通常习惯添加proxy_cookie_domain配置,来作cookie的域名转换,好比nginx
...
location /api {
proxy_pass https://b.test.com;
proxy_cookie_domain b.test.com a.test.com;
}
...
复制代码
在以前的博客中我也是这么写的,可是在项目中发现,不配置这个属性,依然运转正常,背后冷风阵阵,我发现本身一直以来可能又理解错了这个选项,而后还在这给别人讲。。。后端
咱们首先来看下proxy_cookie_domain的官方定义,api
Syntax: proxy_cookie_domain off; proxy_cookie_domain domain replacement; Default: proxy_cookie_domain off; Context: http, server, location This directive appeared in version 1.1.15.浏览器
Sets a text that should be changed in the domain attribute of the “Set-Cookie” header fields of a proxied server response. Suppose a proxied server returned the “Set-Cookie” header field with the attribute “domain=localhost”. The directive proxy_cookie_domain localhost example.org will rewrite this attribute to “domain=example.org”.缓存
翻译过来就是proxy_cookie_domain参数的做用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性,仅此而已。微信
可是咱们知道response在写set-cookie的时候,domain是一个可选项,并非必填项,因此常常能看到以下这种状况cookie
这个时候因为set-cookie自己就没有domain内容,proxy_cookie_domain也就不没有必要了,这也是为何在部分项目中不配置proxy_cookie_domain依然正常的缘由。可是对于一些设置了domain的项目,好比app
说到这里,咱们再看看以前的错误理解:dom
“proxy_cookie_domain的做用是实现先后端cookie域名转换,保证顺利传递”
乍一看好像也没错,可是如今想一想,理解仍是不够啊,由于proxy_cookie_domain的做用是单向的,并非双向转换的。咱们先看下cookie的传递过程,盗一张图先(懒得画了。。。)
浏览器在发送请求的时候,会在request header中带上cookie项(有内容的话),此时的cookie是一个字符串,一个key=value并用分号分割的字符串,
其中并不包含任何域名信息。这是由于浏览器在设置cookie选项的时候,所选取的内容都是缓存中接口域名下的。而后request的只要请求发送出去以后,cookie中有关domain信息实际上是不存在的,它只是一个普通的字符串,随便proxy_pass到任何位置,都会正常携带下去。所以在前端到后端的request的过程当中,proxy_cookie_domain是没用的
而server端在作响应的时候,经过set-cookie的domain属性,能够控制cookie的生效域名目标,作到诸如二级域名cookie分离等等,若是前端接收到的set-cookie的domain和当前域名不一致,或者一级域名不一致(二级域名能够共享一级域名下的cookie),这个cookie在后续的通讯中就是无效的,因此这里才须要去作domain的转换,也就是说response中set-cookie的domain转换才是有意义的,这也正是proxy_cookie_domain的做用所在。 当reseponse的set-cookie中domain不去设置时,cookie顺利传入浏览器中,浏览器会自动设置这个cookie的生效域名为当前域名。
和这个相似的还有proxy_cookie_path属性,一样的该属性仅做用在修改response set-cookie的path属性,而通常状况下,用的也比较少。
不少问题,有时候都是太过理所固然的觉得它是怎么样的,而且生效了、达到目的了,咱们就认为它是这样的了,但每每打脸就会在后面不期而至。多学习,多去关注一些底层的原理,才会发现本身理解的错误,望诸君共勉~
我擦 这我的又来发广告啦!!:emmm最近咱们又要招人了,蚂蚁金服-芝麻信用招前端P6/7,共5个名额,5个呢!5个!机会可贵!加油啊!你能够的!,大厂你懂的,奖金分你一半啊,感兴趣的快来试试吧,有兴趣微信聊聊的加我哈heiohiio,简历直接丢我邮箱也能够啊~heioray@sina.com
若是错误,欢迎指出~