IIS 重写规则以将查询字符串添加到 ASP.net 页面中的 .css 和 .js 引用?

Posted

技术标签:

【中文标题】IIS 重写规则以将查询字符串添加到 ASP.net 页面中的 .css 和 .js 引用?【英文标题】:IIS rewrite rule to add querystring to .css and .js references in ASP.net pages? 【发布时间】:2012-03-24 01:42:30 【问题描述】:

是否可以将查询字符串附加到 CSS 和 JS 文件引用(例如,"foo.css" => "foo.css?v=", "goo.js" => "goo.js?v= ”,例如,“1.2.3”)作为入站规则的一部分在哪里?如果有,怎么做?

我们需要能够强制客户端在发布后要求提供最新版本的 CSS 和 JS 文件。重写规则似乎是执行此操作的好地方,但我没有任何文档或留言板发布有关此操作的信息。

谢谢!

【问题讨论】:

【参考方案1】:

我使用以下 IIS 重写规则来执行此操作。您需要做的就是在进行更新时更改版本号。如果您有任何构建自动化,您也许可以在那里实现自动化。

<rewrite>

  <rules>
    <rule name="JS versioning" stopProcessing="true">
      <match url="(.*).js" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="REQUEST_FILENAME" matchType="IsFile" />
        <add input="QUERY_STRING" pattern="version=3911" negate="true" />
      </conditions>
      <action type="Redirect" url="R:1.js?version=3911" redirectType="Permanent" />
    </rule>
  </rules>

</rewrite>

本质上,任何以 .js 结尾的 url 请求都会被拦截并重定向到相同的 url,但带有附加版本号的查询字符串。需要一个后续条件来忽略已经有查询字符串的url,否则会进入无限重写循环。

由于您也想对 css 文件进行版本控制,您可以将匹配 url 更新为匹配 js 和 css 的正则表达式,或者创建一个单独的规则来执行相同的操作但以 css 文件为目标。

【讨论】:

【参考方案2】:

我认为您需要一个出站规则,以便缓存在版本号更改时请求新文件。

【讨论】:

【参考方案3】:

我认为你不需要重写规则,你需要一个 HTTP 过滤器。 它需要动态解析和重写 HTTP 流上的请求。

MSDN documentation

O'Reilly sample

【讨论】:

谢谢。我会调查的。我现在正在做的是将 foo.css 的请求重写为 R:1)?v=blah 这似乎有效,尽管没有错误并不一定意味着我 100% 拥有它。 哇...那篇文章中的所有内容(两个链接都指向同一篇文章)似乎都在反对使用 HTTP 过滤器处理这种情况。多次提到“危险”一词,以提及进行任何响应操作。 :) 文档的日期是 2003 年。当时没有 http.sys 或集成的托管管道。自从 ASP.Net 模块/过滤器更加集成以来,IIS 有了很大的发展。但是泄漏代码很危险,所以清理你的内存。

以上是关于IIS 重写规则以将查询字符串添加到 ASP.net 页面中的 .css 和 .js 引用?的主要内容,如果未能解决你的问题,请参考以下文章

ini 重写规则以将路径的一部分转换为查询字符串键/值对

将重写规则添加到 web.config 会导致 IIS 控制台中的错误

将 URL 重写规则添加到 Wordpress

IIS7 URL 重写 - 添加“www”前缀

重写规则以将两个友好的 url 重定向到同一个文件

IIS URL重写非英文字符的规则问题