2012-11-12 47 views
3

我正在開發一個應用程序,它應該爲請求的「普通」瀏覽器請求和AJAX請求提供不同的內容。 (實際上,如果請求是AJAX,則將響應HTML封裝在JSON對象中)。根據http accept頭來提供內容 - 緩存問題?

爲此,我檢測在服務器側的AJAX請求,並適當地處理響應,請參閱下面的僞代碼:

function process_response(request, response) 
{ 
if request.is_ajax 
{ 
    response.headers['Content-Type'] = 'application/json'; 
    response.headers['Cache-Control'] = 'no-cache'; 
    response.content = JSON(some_data...) 
} 
} 

的問題是,當第一AJAX請求到當前瀏覽的網址是Google Chrome上發生的奇怪事情 - 如果在響應到來並通過JavaScript處理後,用戶單擊某個鏈接(靜態,重定向到其他頁面),然後單擊瀏覽器中的後退按鈕,他會看到返回JSON代碼而不是呈現的網站(記錄服務器我可以說無要求)。在我看來,Chrome存儲最新的請求響應爲特定的URL,並沒有考慮到它有不同的內容類型等。

是我在濫用HTTP協議的Chrome或錯誤

---更新12 11 2012,12:38 UTC

以下PatrikAkerstrand答案,我發現以下Chrome有錯誤:http://code.google.com/p/chromium/issues/detail?id=94369

任何想法如何避免此行爲

回答

3

你還應該包括Vary-header

response.headers['Vary'] = 'Content-Type' 
+0

嗯,它沒有解決問題。但是,按照你的迴應,我發現它是一個谷歌瀏覽器的bug。現在,有什麼想法如何避免這種行爲? * http://code.google.com/p/chromium/issues/detail?id=94369 – migajek

0

Vary是控制內容協商緩存方面的標準方式。不幸的是,它在一些瀏覽器中也有錯誤的實現,請參閱Browser cache vary broken

我會建議使用唯一的網址。 根據您的框架功能,您可以將瀏覽器重定向(302)到URL + .html以強制響應格式,並使緩存鍵在瀏覽器會話中唯一。然後,對於AJAX請求,您仍然可以保留無後綴的URL。或者,您可以使用.json代替後綴AJAX URL。

另一種選擇是:在/api前添加AJAX請求或添加一些緩存提升查詢參數?rand=1234