请帮我理解重写地图,我有这样的设置:
<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>
这是工作,如果我尝试访问这些网页:
但是我想在这些页面上添加一个查询string的可能性,例如:
当我尝试访问这个页面时,我得到了一个404.我怎样才能得到这个工作?
默认情况下,使用重写映射的URL重写规则将在{REQUEST_URI}variables上创build。 这包括URL +查询string。 这允许您使用查询string参数匹配URL并将其重写到其他页面。 非常方便,但这显然不是你想要/需要的。
您只想匹配URL,不带查询string。 为了改变这种情况,您必须将条件中的{REQUEST_URI}replace为{URL} 。 然后只有URL(没有查询string)将与重写映射匹配。 然后,您可以将查询string添加到重写的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>
而不是使用
<add input="{MyMap:{URL}}" pattern="(.+)" />
你也可以试试
<add input="{MyMap:{SCRIPT_NAME}}" pattern="(.+)" />
看这里:
无法获取静态redirect以使用IIS Url Rewrite 2.0