Nginx反向代理理解误区之proxy_cookie_domain

当心这我的,他又在文末发招人广告了!前端

基本内容

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

这种状况下当你用nginx作反向代理的时候,就必需要转换一下了。

误区回溯

说到这里,咱们再看看以前的错误理解: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


若是错误,欢迎指出~

相关文章
相关标签/搜索