我工作的一位架构师最近阅读了Yahoo! 的 Exceptional Performance Best Practices指南,其中说要为页面使用的资源(如 JavaScript、CSS 和图像)使用一个遥远的 Expires 标头。这个想法是你为这些资源在未来几年设置一个 Expires 标头,这样它们总是被浏览器缓存,每当我们更改文件并因此需要浏览器再次请求资源而不是使用它的缓存时,更改文件名通过添加版本号。
不过,他没有将其纳入我们的构建过程,而是有另一个想法。我们不会为每个构建更改源文件和服务器磁盘上的文件名(当然,这会很乏味),我们将伪造它。他的计划是在所述资源上设置远期过期,然后实现两个 HttpModule。
一个模块将在我们的 ASPX 和 HTML 页面发出之前拦截所有响应流,查找资源链接并添加版本参数,即文件的最后修改日期。另一个 HttpModule 将处理所有对资源的请求,并简单地忽略地址的版本部分。这样,浏览器每次在磁盘上发生更改时总是会请求一个新的资源文件,而实际上不必更改磁盘上文件的名称。
说得通?
我的担忧与重写 ASPX/HTML 页面响应流的模块有关。<script>
他只是要在标签的“src”属性和<img>
标签的“href”属性上应用一堆Regex.Replace() <link>
。对于内容类型为“text/html”的服务器上的每个请求,都会发生这种情况。可能每分钟数百或数千。
我知道 HttpModules 被挂接到 IIS 管道中,但这必须在 IIS 发送 HTTP 响应所需的时间上增加一个令人望而却步的延迟。不?你怎么看?