2012-07-26 63 views
2

我有一個非常簡單的測試用例來解釋這個問題。Rails緩存頁面不當 - 如何停止?

這裏是我在ERB文件中顯示在Rails中的頁面。

<div><%=rand%></div> 

<p><a href="http://google.com">Go</a></p> 

爲了顯示錯誤,我加載了頁面。我注意到顯示爲rand1的隨機數字。我點擊Google鏈接。我點擊瀏覽器的「返回」按鈕。我注意到顯示爲rand2的隨機數字。

問題出在這裏: 在Firefox和Chrome中,rand1!= rand2(always)。 在Safari和IE中,rand1 == rand2(always)。

爲什麼瀏覽器的差異?爲什麼Safari和IE緩存來自Rails的輸出,而另外兩個瀏覽器卻沒有?如何讓Safari和IE刷新頁面?

(這是一個簡單的測試案例來顯示問題 - 這在我的Backbone應用程序中有影響)。

+0

你正在使用什麼樣的緩存?頁面,動作和片段緩存? – 0x4a6f4672 2012-08-06 13:37:36

回答

0

特別是WebKit有一個積極的頁面緩存策略,用於完全處理您描述的情況(單擊鏈接,然後立即單擊後退按鈕)。這個想法是通過緩存不僅資源,而且還包括DOM和頁面的其他狀態,來立即發生後退動作。您可以在這兩篇文章中讀到它:

您可以使用load/unloadpageshow/pagehide事件的組合來完成你所需要的。

我不確定IE是否實現了類似於WebKit的東西,但也許這也會解決它。

2

IE和Safari似乎緩存來自服務器的響應,顯然;只要您的瀏覽器配置正確,您可以通過更改響應中的Cache-Control標頭來更改此設置。

Another Stack Overflow post顯示了適當的方式來做到這一點,雖然在Rails 3中有一個快捷方法來實現這一點:您可以在控制器操作中調用expires_now以避免手動設置所有這些標頭。

+0

不,這似乎沒有工作。添加了標籤並仍然看到相同的行爲。 – bluedevil2k 2012-07-30 13:30:06

+0

查看此答案http://stackoverflow.com/a/748646/226672 – 2012-08-04 17:30:19