3

我正在与通过第三方设置移动网站的客户合作。目前,我们通过 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>

如上所述,我们在 URL 和 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>
4

2 回答 2

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>

这将检查查询字符串是否为 mobileoptout=1 的第一个条件。如果为 true,它将在名为“mobileoptout”的响应中设置一个 cookie,在根域中设置一个值为 1 的 cookie,该 cookie 将随会话过期。

这正是我所忽略的。

于 2013-05-31T16:57:39.967 回答
1

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

为此,在 iis 管理器中,在该URL Rewrite部分下,单击View Server Variables...

菜单

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 值。

于 2013-05-30T15:53:15.000 回答