请帮助我理解重写地图,我有这样的设置:
<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。我该如何让它正常工作?
答案1
默认情况下,使用重写映射的 URL 重写规则是根据{请求URI}变量。这包括 URL + 查询字符串。这允许您匹配带有查询字符串参数的 URL 并将其重写到其他页面。非常方便,但这显然不是您想要/需要的。
您希望仅匹配 URL,而不匹配查询字符串。为了更改此设置,您必须替换{请求URI}在条件下{网址}。然后,只有 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>
答案2
而不是使用
<add input="{MyMap:{URL}}" pattern="(.+)" />
你也可以尝试
<add input="{MyMap:{SCRIPT_NAME}}" pattern="(.+)" />
看这里: