IIS重写,重写映射和查询字符串


10

请帮助我了解重写地图,我有以下设置:

<rewriteMap name="MyMap">
   <add key="/pages" value="/website/pages/index.aspx" />
   <add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
   <add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>

这是我的规则:

<rule name="Rewrite rule for MyMap" stopProcessing="true">
   <match url=".*" />
   <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      <add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

如果我尝试访问以下页面,则此方法有效:

  • www.mydomain.com/pages(确定)
  • www.mydomain.com/pages/page-1(确定)
  • www.mydomain.com/pages/page-1/section-1(确定)

但是我希望可以在任何这些页面上添加查询字符串,例如:

  • www.mydomain.com/pages?page=1(失败)

当我尝试访问此页面时,我得到404。如何使它工作?

Answers:


12

默认情况下,会使用{REQUEST_URI}变量创建使用重写映射的URL重写规则。这包括URL +查询字符串。这使您可以与带有查询字符串参数的URL匹配,并将它们重写到其他页面。非常方便,但这显然不是您想要/不需要的。

您只想与URL匹配,而没有查询字符串。为了更改此设置,您必须将条件中的{REQUEST_URI}替换为{URL}。然后,仅URL(无查询字符串)将与重写映射进行匹配。然后,您可以将查询字符串添加到重写的URL,以便执行的脚本仍然可以访问它。

您最终得到如下规则:

<rule name="Rewrite rule for MyMap">
    <match url=".*" />
    <conditions>
        <add input="{MyMap:{URL}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

1
很好的解释。我一直想知道如何也出于匹配目的而忽略QueryString。
dthrasher 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.