IIS重写规则未设置HTTP_COOKIE

时间:2013-05-17 15:30:45

标签: iis iis-7 url-rewriting

我正在与通过第三方设置移动网站的客户合作。目前,我们通过IIS检查用户代理是否与您的任何标准移动代理匹配,在这种情况下,我们将用户重定向到移动版m.whatever.com。

我们的一条规则要求我们在用户想要再次查看移动网站时将cookie设置为值0。

<rules>
    <rule name="if httpcookie is , set it to 0" stopProcessing="true">
        <match url="^(.*)$" />
        <conditions>
            <add input="{HTTP_COOKIE}" pattern="mobileoptout=1" />
        </conditions>
        <serverVariables>
            <set name="HTTP_COOKIE" value="mobileoptout=0" />
        </serverVariables>
        <action type="None" />
    </rule>
</rules>

根据以上所述,我们匹配网址和Cookie值。我已经独立测试了它们,它们按预期工作。但是,在此规则结束时,Cookie MobileOptOut的值仍为1而不是0.

我搜索并尝试了许多网站上提供的所有示例,但完全无法理解为什么cookie的价值没有被更改。

cookie的域名是[whatever.com],与www.whatever.com相同,并且根据之前的测试,它可以从cookie中读取以验证条件。

有什么想法吗?

包括一项无效的额外尝试:

<rules>
   <rule name="set cookie">
     <match url="(.*)" />
     <serverVariables>
       <set name="HTTP_COOKIE" value="optout=1" />
       <set name="{HTTP_COOKIE}" value="optout=2" />
     </serverVariables>
     <action type="None" />
   </rule>
</rules>

2 个答案:

答案 0 :(得分:3)

感谢@cheesemacfly,我研究了使用出站规则,出于某种原因我完全忽略了这一规则。

该解决方案使用单个入站规则来检查两个条件。

<rule name="MobileOptOut=1 Stop Processing Rules" stopProcessing="true">
  <match url="(.*)" />
  <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
    <add input="{QUERY_STRING}" pattern="mobileoptout=1" />
    <add input="{HTTP_COOKIE}" pattern="MobileOptOut=1" />
  </conditions>
  <action type="None" />
</rule>

这将处理带有查询字符串的第一个请求以及将在此规则完成后创建的cookie的所有后续请求。

出站规则如下:

<outboundRules>
  <rule name="if querystring=1" preCondition="If mobileoptout query = 1">
    <match serverVariable="RESPONSE_Set_Cookie" pattern="." />
    <action type="Rewrite" value="mobileoptout=1; Domain=site.local; Path=/;" />
  </rule>
  <preConditions>
    <preCondition name="If mobileoptout query = 1">
      <add input="{QUERY_STRING}" pattern="mobileoptout=1" />
    </preCondition>
  </preConditions>
</outboundRules>

这将检查if querystring的第一个条件是mobileoptout = 1。如果为true,它将在名为“mobileoptout”的响应中设置一个cookie,其根域中的值为1,将随会话一起过期。

这正是我所忽视的。

答案 1 :(得分:1)

首先,为了确保您的规则可以正常工作,您必须设置允许的服务器变量。

为此,请在iis管理员的URL Rewrite部分下,点击View Server Variables...

menu

然后,您可以点击右侧的Add...添加新变量 在您的情况下,您想添加HTTP_COOKIE

http_cookie

从这里开始,你的规则(如下)应该有效:

<rules>
    <rule name="if httpcookie is , set it to 0" stopProcessing="true">
        <match url="^(.*)$" />
        <conditions>
            <add input="{HTTP_COOKIE}" pattern="mobileoptout=1" />
        </conditions>
        <serverVariables>
            <set name="HTTP_COOKIE" value="mobileoptout=0" />
        </serverVariables>
        <action type="None" />
    </rule>
</rules>

请注意,cookie仅针对请求进行重写 这意味着客户端cookie不会被更改,但是当触发规则时,命中页面的请求将具有新的cookie值。

相关问题