2012-07-26 22 views
1

我有在本地運行時的ASP.NET/MVC的Web應用程序會產生這個頭:如何防止在AppHarbor中丟失我的Cache-Control頭部的Max-Age部分?

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部分,並在我的Date中踩踏了一個未與之同步的日期。

我的目標是通過CDN以非常短的最大年齡提供JavaScript,以便可以快速推出更改。經常更改網址不是一個選項。

有誰知道如何解決這個問題?

+0

你打算在AppHarbor上運行CDN嗎? – friism 2012-07-27 00:19:36

+0

3秒似乎是一個相當短暫的緩存時間 - 事實上,它有點延伸單詞「緩存」的定義。 CDN服務器不會經常打你的服務器進行更新嗎?將版本查詢字符串添加到頁面中的腳本引用以控制緩存行爲? – 2012-07-27 15:42:35

回答

2

誰更仔細地檢查了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的。

+0

有趣。確保你接受你自己的答案。 – ganders 2014-03-04 21:06:44