【问题标题】:Capturing a Value in a Cookie using URL Rewrite for IIS7使用 IIS7 的 URL 重写捕获 Cookie 中的值
【发布时间】:2012-02-04 13:04:00
【问题描述】:

我需要为我的 IIS 7.5 网站编写 URL 重写规则,该规则捕获特定 cookie 中的值,然后使用该值构造 URL。例如,传入的请求如下所示:

GET http://myserver.com/test.aspx HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0
Host: myserver.com
Cookie: foo=bar; bat=bar

我想将它们路由到此(基于“foo”cookie 值):

http://myserver.com/bar/test.aspx

在查看文档并搜索示例后,我被难住了!感谢您的帮助。

【问题讨论】:

    标签: iis-7 url-rewriting


    【解决方案1】:

    回答我自己的问题,这是一个工作示例。根据需要支持的字符,该模式可能需要额外的工作,但以下规则将使用发现的 cookie 值并路由到发现的服务器——服务器可以通过 IPv4 地址或名称(字母数字和句点)指定)。

    <rule name="Route Base On Cookie" stopProcessing="true">
      <match url="^(.*)" />
        <conditions>
           <add input="{HTTP_COOKIE}" pattern="foo=(.*?);" />
        </conditions>
      <action type="Rewrite" url="http://{C:1}/{R:0}" />
    </rule>
    

    【讨论】:

    • 我建议 pattern="foo=[^;]*" 使模式匹配任何可能的 cookie 值——你的模式太严格了。见the original spec from Netscape.com,它说“这个字符串是一个不包括分号、逗号和空格的字符序列。如果需要在名称或值中放置这样的数据,一些编码方法,如URL样式%XX编码是推荐,尽管没有定义或要求编码。”您可以直接使用pattern="foo=[^;,\s]*"
    • @Geoffrey - 我在类似领域面临问题 - 你能回答这个问题吗? - stackoverflow.com/questions/34506551/…
    • 这有点烦人,我的 cookie 位于字符串的末尾并且没有以分号结尾 /en/#accept-en-empty?cookie=ARRAffinity=201b1fd8d701339a2f00e0ee61740aea30fa71e70a108b56894fc119e397c038;%20locale=fr
    • 如果 foo 是唯一的 cookie 或者它在 cookie 列表中的最后一个,它将不起作用。因为 ”;”在模式中。
    【解决方案2】:

    @Geoffrey 为了让您的代码支持返回任何 cookie 值,我推荐这种模式:

    <add input="{HTTP_COOKIE}" pattern="foo=(.*?);" />
    

    提醒一下,{HTTP_COOKIE} 值如下所示:

    Cookie: foo=myexamplevalue;到期=格林威治标准时间 2014 年 5 月 3 日星期三 22:31:08;路径=/; HttpOnly\r\n

    【讨论】:

    • 我最初评论是为了纠正你的正则表达式,来看看,? 使* 不贪婪。做得好。虽然我更喜欢否定字符类,因为它们可能更快(尤其是在给定所有格修饰符 + 时)。
    • {HTTP_COOKIE} 来自服务器(不是来自服务器)没有 expires=Wed, 03-May-2014 22:31:08 GMT; path=/; HttpOnly 部分。就像Cookie: foo=myexamplevalue。没有 ';'在末尾。您可以在浏览器的 DevTools 的 Network 选项卡中查看它。
    【解决方案3】:

    以下规则将使用发现的 cookie 值并路由到发现的路径:

    <rule name="Route Base On Cookie" stopProcessing="true">
      <match url=".*" />
      <conditions>
         <add input="{HTTP_COOKIE}" pattern="^(.+; )?foo=([^;]*)(;.+)?$" />
      </conditions>
      <action type="Rewrite" url="https://{HTTP_HOST}/{C:2}/{R:0}" />
    </rule>
    

    该模式支持多个cookie并且不依赖于cookie中foo的顺序(当它是最后一个时,浏览器不会附加';'):
    foo=bar; bat=barbat=bar; foo=bar 都可以正常工作。
    当您有另一个具有相同子字符串的cookie(例如barfoo)时,它可以正常工作。
    {C:2}对应于cookie中的第二个捕获,即pattern="..."foo的值;
    {R:0}对应到&lt;match url="..."&gt; 中的整个网址。 IIS 只使用没有主机名的路径部分,即/test.aspx

    注意。按原样在路径中使用来自 cookie 的值可能不安全。可能您应该匹配预期值列表(bar|bar2|bar3|bar4)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-30
      • 2013-04-09
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多