我为IIS7使用URL重写模块 - 因为少量静态文件的URL重写。
基本上我将/ pretty-url映射到/real-file-name.html
到目前为止很简单。
但是在将查询字符串添加到漂亮网址后,它会抛出404状态代码。到目前为止,我还没有找到任何解决方法。有什么建议,或者我做错了什么?
以下是配置:
<rewriteMaps>
<rewriteMap name="CoolUrls">
<add key="/pretty-url" value="/real-file.html" />
... and so on ...
</rewriteMap>
</rewriteMaps>
和
<rules>
<clear />
<rule name="Rewrite rule for CoolUrls" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{CoolUrls:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
</rules>
任何带有查询的请求(标记后的任何参数)都以404状态代码结束。
答案 0 :(得分:4)
我假设您希望能够添加查询字符串,并且必须将此查询字符串附加到重写的请求中。您可能不希望查询字符串包含在重写映射的匹配中。因为这实际上是您使用{CoolUrls:{REQUEST_URI}}
所做的事情,因为{REQUEST_URI}
也包含查询字符串。您应该将其替换为{CoolUrls:{R:0}}
。
完整规则:
<rule name="Rewrite rule for CoolUrls" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{CoolUrls:{R:0}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
更新:您应该更新重写地图,因为{R:0}
(网址)不包含网址的前导斜杠。所以你的重写地图应该是:
<rewriteMaps>
<rewriteMap name="CoolUrls">
<add key="pretty-url" value="/real-file.html" />
<add key="another/pretty-url" value="/another/real-file.html" />
... and so on ...
</rewriteMap>
</rewriteMaps>
答案 1 :(得分:1)
另一种方法是拉SCRIPT_NAME
而不是REQUEST_URI
或R:0
。它也会匹配rewriteMap键中的前导斜杠。我遗漏了高级和可选配置(clear,trackAllCaptures等),作为其他人的更好起点:
<rules>
<rule name="Rewrite rule for CoolUrls">
<match url=".*" />
<conditions>
<add input="{CoolUrls:{SCRIPT_NAME}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
</rules>
答案 2 :(得分:0)
这解决了这个问题: https://stackoverflow.com/a/45555140/1967211 需要使用PATH_INFO而不是REQUEST_URI