【问题标题】:IIS URL Rewrite Rule with Params带参数的 IIS URL 重写规则
【发布时间】:2011-06-21 16:53:21
【问题描述】:

我很难让 URL 重写规则起作用。

我想要这个网址:

http://www.mysite.com/oldpage.aspx?oldid=123

重写为:

http://www.mysite.com/sub/newpage.aspx?newid=123

这是我所拥有的,但它不起作用:

<rule name="Old2New" stopProcessing="true">
    <match url="^oldpage.aspx?oldid=([0-9]+)" />
    <action type="Rewrite" 
            url="/sub/newpage.aspx?newid={R:1}" 
            appendQueryString="true"  />
</rule>

我错过了什么?

【问题讨论】:

  • 您使用的是什么版本的 ASP.NET? .NET 4 与以前的版本有很大的不同(坦率地说,在以前的版本中,URL 重写很糟糕)。
  • @pearcewg - 实际上,UrlRewrite 是 IIS 的功能/扩展,与您运行的 ASP.NET 版本无关。如果您没有适当的基于 ISAPI 的重写器(例如 ISAPI_Rewrite 或 Iconic Rewriter),我认为您会将其误认为是您必须在 IIS6 上执行的各种任务(通配符映射、httpmodules 等)。
  • 我已将问题缩小到问号。如果我通过将 matchURL 更改为“^oldpage.aspx\?oldid=([0-9]+)”来转义它,测试匹配似乎有效,但通过 IIS 的请求不会被重写。

标签: iis iis-7 url-rewriting url-rewrite-module


【解决方案1】:

正则表达式索引从 0 而不是 1 开始。所以你的规则应该是:

<rule name="Old2New" stopProcessing="true">
    <match url="^oldpage.aspx?oldid=([0-9]+)" />
    <action type="Rewrite" 
            url="/sub/newpage.aspx?newid={R:0}" 
            appendQueryString="true"  />
</rule>

您可以在 IIS7 界面中轻松测试您的规则。

【讨论】:

  • 其实{R:0}返回"oldpage.aspx?oldid=123",{R:1}返回123,貌似是问号的问题。
【解决方案2】:

使用条件捕获查询字符串部分{C:1},如下所示:

<rule name="My rule" stopProcessing="true">
    <match url="^oldpage\.aspx" ignoreCase="true" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{QUERY_STRING}" pattern="oldid=([0-9]+)" />
    </conditions>
    <action type="Redirect" url="/sub/newpage.aspx?newid={C:1}" appendQueryString="false" />
</rule>

经过测试并且可以正常工作。

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2014-05-01
    • 2011-04-21
    • 2013-11-10
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多