【问题标题】:Url rewriting rules for static web pages - returning 404 after using url with additional parameters静态网页的url改写规则——使用url带附加参数后返回404
【发布时间】:2012-11-10 23:54:23
【问题描述】:

我使用 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 状态码结束。

【问题讨论】:

  • 尝试将 appendQueryString 设置为 false 和其他相关选项。也许其他一些正则表达式模式只匹配没有参数的部分?

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


【解决方案1】:

我假设您希望能够添加一个查询字符串,并且该查询字符串必须附加到重写的请求中。您可能不希望查询字符串包含在重写映射的匹配中。因为这实际上就是您对{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>

【讨论】:

  • 遗憾的是没有帮助并且根本停止工作(没有重写工作)。但我想我理解并将尝试为脚本路径和其余 url 伪造正则表达式,并希望我能找到一些东西。
  • 我已经更新了我的答案。您必须稍微修改重写映射,因为 {R:0} 变量不包含前导斜杠。
  • 谢谢(!!!),它现在正在工作。只是感觉我真的不知道发生了什么事。当匹配 url 模式(也没有条件模式)中没有分组时,如何将路径(无查询)获取到 R:0。
  • 语法为{R:x} 的变量引用&lt;match&gt; 标签的url{R:0} 匹配整个 URL,其中 {R:1} 匹配正则表达式的第一组,{R:2} 第二组等。语法为 {C:x} 的变量引用 &lt;add&gt; 的标签的 pattern状况。当使用多个条件时,您应该使用trackAllCaptures="true" 以便能够引用它们。使用哪个数字取决于条件数和正则表达式中的组数。 IIS 管理器中的正则表达式测试工具会显示它们。
【解决方案2】:

另一种方法是拉动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>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2014-11-11
      • 2017-09-08
      • 2013-11-10
      • 2020-08-03
      相关资源
      最近更新 更多