URL 重写是用两个段重写我的所有文件

URL rewriting is rewriting ALL my files with two segments

这是我在网络配置中的规则

<rule name="rewrite">
  <match url="^([^/]+)/([^/]+)?$" />
<action type="Rewrite" url="/review.aspx?c={R:1}&amp;t={R:2}" appendQueryString="false" />
</rule>

成功将review.aspx?c=value&t=value变为/value/value

我现在的问题是,我的 /css/style.css 现在加载为 review.aspx

有办法阻止吗?不仅 CSS,而且所有实例?

Rewrite rule conditions 使您可以限制重写规则的应用,使其仅适用于满足条件的请求。

通过定义如下所示的条件,您可以确保仅对与现有文件不匹配的 URL 进行重写。

<rule name="rewrite">
  <match url="^([^/]+)/([^/]+)?$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Rewrite" url="/review.aspx?c={R:1}&amp;t={R:2}" appendQueryString="false" />
</rule>

它的工作方式是,对于每个请求,在重写发生之前,重写引擎会检查是否满足定义的条件,然后在不满足条件的情况下跳过重写规则。

我们定义的条件是:请求不能引用磁盘上的实际文件。

这样做的原因是我们只希望将重写应用于具有 /value/value 等虚拟 URL 的请求,而不是对 /css/style.css.

等静态文件的请求

要准确分解条件的不同属性的含义:

  • input="{REQUEST_FILENAME}" 告诉重写引擎我们想要 针对 REQUEST_FILENAME 服务器变量执行测试。这 该变量的值类似于 C:/mywebsite/value/valueC:/mywebsite/css/style.css.
  • matchType="IsFile" 告诉引擎检查上面的输入是否匹配磁盘上的现有文件。
  • negate="true" 告诉引擎反转检查结果,这样当输入 匹配现有文件时满足条件,而不是当它确实匹配。

由于匹配模式,您可能需要添加排除项,例如:

<conditions logicalGrouping="MatchAll">
    <add input="{REQUEST_URI}" pattern="\.js|\.css|\.jpg" negate="true" />
</conditions>