2012-07-26 253 views
22

我們的一些鏈接被PJAX包裝。當用戶點擊PJAX鏈接時,服務器只返回HTML的必需部分。PJAX:後退按鈕問題

如果我做到以下幾點:

  1. 點擊PJAX鏈接
  2. 點擊簡單的鏈接
  3. 按後退按鈕

瀏覽器會顯示由PJAX請求返回的內容。 HTML將被打破,因爲它只是要顯示的HTML的一部分(請檢查this question)。

我們試圖通過不緩存PJAX響應來解決此問題(Cache-Control標題)。這解決了我們的問題,但提出了另一個問題: 當用戶按下後退按鈕時,WebKit(Chrome 20.0)從服務器加載完整內容,然後觸發導致不必要的PJAX請求的popstate事件。

是否可以重新創建正確的後退按鈕行爲?

+1

我也有類似的問題,但並不完全一樣,也許它可以幫助你http://stackoverflow.com/questions/15394156/back-button-in-browser-not-working-properly-after-using-pushstate-in-chrome/15805033#15805033 – 2013-04-18 06:53:07

回答

3

這一切都取決於服務器緩存設置。您的瀏覽器緩存來自服務器的AJAX響應,並且當您單擊後退按鈕時,它使用緩存版本。

以防止緩存設置以下的服務器頭:

'Cache-Control' => 'no-cache, no-store, max-age=0, must-revalidate' 
'Pragma' => 'no-cache' 

如果您使用Rails,那麼一定要試試Wiselinks https://github.com/igor-alexandrov/wiselinks。它是瀏覽器狀態管理的瑞士軍刀。這裏有一些細節:http://igor-alexandrov.github.io/blog/2013/07/11/the-way-to-wiselinks-1-dot-0/

2

爲了讓瀏覽器根據請求標頭瞭解不同版本的HTTP資源,我添加了一個Vary http頭。

使用Vary,你不需要再發送no-cache標題,因此再次讓你的頁面更快。

在PHP中,這看起來像:

header("Vary: X-PJAX"); 

因爲我們有時會用每URL 3只表示(常規HTTP,pjax和Ajax) - 實際上我們 - 因爲遷移到一個已經有時支持Ajax的應用程序一個PJAX方法使用方法:

header("Vary: X-PJAX,X-Requested-With"); 

如果你需要支持舊的IE(年齡大於IE9)版本,則需要確保Vary標頭是您的網絡服務器剝離,因爲otherweise老IE將禁用緩存所有的資源,提供一個Vary標題。

這可以通過以下設置在你的.htaccess /虛擬主機配置來實現:

BrowserMatch "MSIE" force-no-vary 

編輯: 底層鍍鉻的bug,https://code.google.com/p/chromium/issues/detail?id=94369