【问题标题】:How to prevent losing the Max-Age portion of my Cache-Control header in AppHarbor?如何防止在 AppHarbor 中丢失我的 Cache-Control 标头的 Max-Age 部分?
【发布时间】:2012-07-26 21:31:58
【问题描述】:

我有一个 ASP.NET / MVC Web 应用程序,它在本地运行时会生成此标头:

Cache-Control:public, max-age=3
Connection:Close
Content-Encoding:gzip
Content-Length:287122
Content-Type:text/javascript
Date:Thu, 26 Jul 2012 21:21:26 GMT
ETag:K5fBpkMM+t9XPl07ydQ54pR6bg8=
Expires:Thu, 26 Jul 2012 21:21:29 GMT
Server:ASP.NET Development Server/10.0.0.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0

但是当在他们的代理后面的 AppHarbor 中运行时,我得到的标题是:

Cache-Control:public
Connection:keep-alive
Content-Encoding:gzip
Content-Length:287122
Content-Type:text/javascript
Date:Thu, 26 Jul 2012 21:22:49 GMT
ETag:K5fBpkMM+t9XPl07ydQ54pR6bg8=
Expires:Thu, 26 Jul 2012 21:22:41 GMT
Server:nginx

AppHarbor 正在剥离我的 Cache-Control 标头的 Max-Age 部分,并用我不与之同步的日期踩踏我的日期。

我的目标是通过 CDN 提供 JavaScript 服务,其最大使用期限非常短,以便可以快速推出更改。经常更改网址不是一种选择。

有谁知道如何解决这个问题?

【问题讨论】:

  • 你打算在 AppHarbor 之外运行你的 CDN 吗?
  • 3 秒似乎是一个相当短的缓存时间——事实上它在某种程度上延伸了“缓存”这个词的定义。 CDN 服务器不会经常访问您的服务器进行更新吗?将版本查询字符串添加到页面中的脚本引用以控制缓存行为怎么样?

标签: asp.net asp.net-mvc http cache-control appharbor


【解决方案1】:

仔细检查RFC 的一所大学注意到它看起来像是服务器和浏览器使用的此标头的常见单行形式:

Cache-Control: public, max-age=X

实际上是无效的。将标题的两个部分分成两行,如下所示:

Cache-Control: public
Cache-Control: max-age=X

有效!所以在我的 .net 代码中,这个:

response.Cache.SetCacheability(HttpCacheability.Public);
response.Cache.SetMaxAge(MaxAge);

变成这样:

response.AddHeader("Cache-Control", "public");
response.AddHeader("Cache-Control", "max-age=" + (int)MaxAge.TotalSeconds);

现在我可以从 AppHarbor 中获得最大年龄。

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 2011-12-08
    • 2020-03-08
    • 2015-04-08
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多