视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
IIS实现反向代理时Cookie域的设置方法
2020-11-27 22:35:06 责编:小采
文档

反向代理

神马是反向代理?指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。我们可以通过反向代理实现负载平衡、突破防火墙等一些非常实用的Web服务器功能,目前反向代理不管在私有云还是公有云的虚拟机上用的很多很多。

引用

IIS通过URL重写可以实现反向代理,通过简单的配置即可以将请求转发到其它内部站点。

此时被代理的所有站点的cookie的域(domain)会自动设置为提供反向代理功能的站点的域,这一般来说没有问题。但是在多站点共享cookie时会存在问题。

比如有一个对外的域名 proxy.fireflysoft.net,这个域名指向一个提供反向代理的站点;然后还有一个域名pay.fireflysoft.net,指向一个的IIS站点,提供支付服务;然后proxy.fireflysoft.net/mall 提供商城服务,用户在这里下单后支付,需要跳转到pay.fireflysoft.net;

为了在这两个站点之间实现用户状态共享,这里希望他们之间可以共享SessionID,这个值保存在cookie中,所以实际上是期望共享cookie,共享cookie可以通过设置不同站点cookie的域为相同的值来实现。

比如这里希望proxy.fireflysoft.net和pay.fireflysoft.net的cookie域值都为fireflysoft.net,这样proxy.fireflysoft.net的用户状态就可以为pay.fireflysoft.net所使用。但是这面临上边提到的反向代理站点cookie域自动设置问题。

关于这个问题,网上可以搜索到的方案大部分都是Nginx的,其实IIS的URL重写也是支持的,只不过用的人可能比较少,所以查不到什么资料。

这个解决方案是在IIS的论坛上找到的,有人问同样的问题:https://forums.iis.net/t/1193378.aspx。帖子中并没有给出直接的答案,而是参考一个使用URL重写设置cookie HttpOnly的方案:

http://clarify.dovetailsoftware.com/gsherman/2011/01/20/using-the-url-rewrite-module-to-set-your-cookies-to-httponly/

有兴趣的可以读一下原文,下边将直接给出解决方案。

URL重写的规则会保存到web.config中,因为设置cookie属于URL重写的出站规则,所以直接在出站规则中增加相关配置:

<rewrite> 
<outboundRules> 
<rule name="Add Domain" preCondition="No Domain">
 <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
 <action type="Rewrite" value="{R:0}; domain=fireflysoft.net" />
 <conditions>
 </conditions>
 </rule>
 <preConditions>
 <preCondition name="No Domain">
 <add input="{RESPONSE_Set_Cookie}" pattern="." />
 <add input="{RESPONSE_Set_Cookie}" pattern="; domain=.*" negate="true" />
 </preCondition>
 </preConditions>
 </outboundRules>
 </rewrite>

代码中包含两部分:

首先是前提条件preConditions:针对响应时设置cookie,且没有设置cookie domain的情况;

然后是处理规则rule:针对响应时设置的cookie,重写cookie,增加domain的设置。

这样cookie domain即设置为目标值,从而实现cookie在二级域名之间的共享。

总结

下载本文
显示全文
专题