网址重写静态网页的规则 - 在使用带有其他参数的网址后返回404

时间:2012-11-22 14:47:34

标签: iis iis-7 url-rewriting http-status-code-404 url-parameters

我为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状态代码结束。

3 个答案:

答案 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_URIR: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