3

我使用 IIS7 的 URL 重写模块 - 因为 URL 重写了几个静态文件。

基本上我将 /pretty-url 映射到 /real-file-name.html

到目前为止,这很简单。

但是在将查询字符串添加到漂亮的 url 之后,它会抛出 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 状态码结束。

4

3 回答 3

5

我假设您希望能够添加一个查询字符串,并且这个查询字符串必须附加到重写的请求中。您可能不希望查询字符串包含在 rewritemap 的匹配中。因为这实际上就是您正在做的事情,{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}(URL)不包括 URL 中的前导斜杠。所以你的重写图应该是:

<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>
于 2012-11-22T22:21:24.423 回答
1

另一种方法是通过拉SCRIPT_NAME而不是REQUEST_URIor 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>
于 2013-07-01T19:55:25.210 回答
0

这解决了问题: https ://stackoverflow.com/a/45555140/1967211 需要使用 PATH_INFO 而不是 REQUEST_URI

于 2017-08-07T20:32:09.273 回答