2012-07-04 56 views
6

我有一個可以在URL /產品上訪問的頁面。當我在瀏覽器中訪問它時,它會在佈局中響應整個頁面。下面是請求頭和響應身體的一個簡化的例子:瀏覽器不區分通過AJAX獲取的部分HTML和整頁

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

<layout> 
<products /> 
</layout> 

當使用者做一些搜索經由AJAX的JavaScript更新結果。因爲它需要時間來呈現的結果沒有佈局呈現,我並不需要它無論如何:

Accept: */*;q=0.5, text/javascript, application/javascript, application/ecmascript, application/x-ecmascript 
X-Requested-With: XMLHttpRequest 

<products /> 

所以,這個工作得很好,直到我說緩存Cache-Control: private, max-age=3600。最初,我雖然會添加Vary: X-Requested-With標題,瀏覽器會區分這兩個響應。但是,當我通過AJAX獲取/產品,然後訪問瀏覽器中的/ products時,它會顯示部分AJAX響應。

有沒有簡單的方法來解決這個問題?

P.S.如果有問題,我使用Ruby on Rails和jQuery。

+2

你試過了'Vary:Accept'嗎? – regilero

+0

是的,它也不起作用。我認爲瀏覽器正在緩存這兩個響應。但是由於Content-Type:text/html,它將它們同等對待並顯示最後一個恰好是部分的。 –

+0

其實,我試着用JSON迴應,現在它顯示JSON。所以這不依賴於Content-Type:text/html。我很驚訝「Vary」在這裏沒有任何效果。 –

回答

1

讓您的Ajax調用使用不同的URL,例如/ products/partial。

+0

這看起來像現在唯一的解決方案。但這意味着我需要修改客戶端JavaScript中的每個URL,這不是很方便。 –

0

你應該有部分結果diferent URL(即2分= yes或這樣的事情...)

OR

你可以通過AJAX整個頁面,並提取只是一部分,你想要使用jquery.load()。

$("#productsContainerHolder").load("/my/products/url #productsContainer", { myParam: "beer", myParam2: "cold"}); 

$ .load會打電話給你的服務器有一個 'GET' 方法,檢索所有內容,從那裏提取#productsContainer並插入的 「#productsContainerHolder」

<div id="productsContainerHolder"> 
    <div id="productsContainer> 
     ... 
    </div> 
</div> 
+0

我沒有渲染布局,因爲它需要大量的響應時間。提取並不是真正的問題。 –

0

article由史蒂夫Lüscher的描述了一個類似的情況,這個問題比你描述的更加間歇。建議的解決方案是:

  1. 根據響應在表單提交

  2. 使用不同的網址的時間取消所有的AJAX請求您期望

史蒂夫用ajax請求中的cancel()去了#1。

你不提什麼瀏覽器,你都用過,有一個瀏覽器相關的問題here

+1

第一種解決方案並不適用於我的情況。但我很高興看到其他人報告相同的問題。您鏈接的問題似乎與我無關,但我使用的是Safari。也在Firefox中測試過。 –

0

使用Vary: Accept。這應該工作。

+0

我試過這個,但問題仍然存在。從上面複製我的想法:我認爲瀏覽器正確緩存兩個響應。但是由於Content-Type:text/html,它將它們同等對待並顯示最後一個恰好是部分的。 –

0

可能最簡單的方法是將jquery的Ajax方法的'cache'參數設置爲'False'。它會自動附加一個時間戳到URI,防止它被緩存。

這可以被廣泛應用做用下面的代碼片段:

$.ajaxSetup({ 
    cache: false 
}); 

如果緩存即使對於動態請求事情做,你可以基於與小時沿日期生成自己的時間戳。

0

嘗試發送必須重新驗證而不是私人(這是更多的代理)。

Cache-Control: max-age=3600, must-revalidate 

我建議你閱讀這篇文章:http://www.mnot.net/cache_docs/它可能會有所幫助。 也可以使用Mark的工具http://redbot.org/來測試你的結果,以消除你的本地機器或isp或不是。

相關問題