在ISS的web.config中重写规则

时间:2013-05-01 11:34:14

标签: iis url-rewriting web-config

我只是想在ISS上运行一些已在Apache上运行很长时间的代码。

特定的mod_rewrite规则很难开始工作。

在Apache我用过:

RewriteRule ^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$ /media/$1/$2.$4 

[L]

要将/media/css/style.1367406756.css之类的网址转换为/media/css/style.css,请让我在文件中加入时间戳以避免缓存问题。

在我的web.config文件中,我添加了:

<rule name="Cache bust assets" stopProcessing="true">
    <match url="^(.*)$"/>
    <conditions>
    <add input="{URL}" pattern="^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$"/>
    </conditions>
    <action type="Rewrite" url="/media/{R:1}/{R:2}.{R:4}" appendQueryString="true" />
</rule>

哪个看起来应该有效。 (它与另一条规则一起工作正常,因此并不是服务器不解析它或任何东西)。

我没有收到任何错误,除了访问/media/css/style.1367406756.css给我一个404错误。

我该如何使这项工作?

1 个答案:

答案 0 :(得分:0)

由于信息来自{R:N},因此当您使用action时,{C:N}使用conditions返回引用。有关详细信息,请参阅Using Back-references in Rewrite Rules

如果您打开iismanager控制台,则可以看到此错误:

alerts

要让你的规则发挥作用,你有2个解决方案。

首先,您可以将操作更改为(使用{C:N}):

<action type="Rewrite" url="/media/{C:1}/{C:2}.{C:4}" appendQueryString="true" />

或者(我认为这是一个更好的解决方案),您可以使用Import mod_rewrite Rules工具。

iismanager控制台中,点击Import Rules...(在右侧标签页上)并粘贴apache规则:

import

这将为您创建以下规则:

<rule name="Imported Rule 1" stopProcessing="true">
    <match url="^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$" ignoreCase="false" />
    <action type="Rewrite" url="/media/{R:1}/{R:2}.{R:4}" />
</rule>