2012-07-20 52 views
0

所以我遇到的問題是我對drupal網站上的一個css文件進行了更改。當我導航到我定位的網站的那一部分時,該變化立即顯示在谷歌瀏覽器上。當我瀏覽到Firefox的那部分網站時,它會顯示我以前訪問過的舊網頁。當然,手動刷新Firefox可以解決這個問題。在drupal站點上使用firefox緩存問題

問題在於,當用戶看到舊版本的頁面時,他們可能不知道點擊刷新按鈕,並且會認爲它已損壞。

所以基本上,有沒有辦法來檢查當前頁面是否被緩存,並告訴firefox在PHP中清除它,或者更優雅的方法?

回答

1

不幸的是,您無法輕易辨別客戶端是否緩存了PHP或任何服務器環境中的頁面。但是,您可以告知瀏覽器是否緩存以及存放多長時間。這是通過設置Cache-Control HTTP標頭(和朋友)來完成的。見this page。大多數人傾向於指定將來長達幾個小時的緩存,因此用戶將看到陳舊的數據不超過2小時。我建議這樣做,但你也可以指示瀏覽器完全關閉緩存。無論如何,我認爲最簡單的解決方案是在你的.htaccess文件中設置這些標題。

下面是一個例子了2個小時的時間限制:

# Cache CSS and JS files for up to 2 hours 
<FilesMatch "\.(css|js)$"> 
    <IfModule mod_headers.c> 
     # Set Max-age to 7200 seconds (2 hours), revalidate after 2 hours (ask the server if the file's changed) 
     Header set Cache-Control "max-age=7200, must-revalidate" 
    </IfModule> 
    FileETag MTime Size 
</FilesMatch> 

另一種選擇是允許緩存,但強制客戶端如果說有什麼在每次請求變更爲要求服務器。這不會有很大的好處,特別是在服務許多css和js文件的頁面上(通常是Drupal的情況),因爲瀏覽器仍然需要向服務器發送每個文件的往返請求:

# Only use cache if checking with the server results in a 304 (Not Modified) 
<FilesMatch "\.(css|js)$"> 
    <IfModule mod_headers.c> 
     # Instruct the client and possibly proxies in front of the client to check for new versions every 0 seconds (always) 
     Header set Cache-Control "max-age=0, public, must-revalidate, proxy-revalidate" 
     # For older browsers 
     Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT" 
    </IfModule> 
    FileETag MTime Size 
</FilesMatch> 

最後,您可以要求瀏覽器禁用緩存。我不建議這一點,除非你確信文件將非常頻繁地改變,因爲頁面加載時間將受到影響:

# Disable caching 
<FilesMatch "\.(css|js)$"> 
    <IfModule mod_headers.c> 
     Header set Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0" 
     # For older browsers 
     Header set Expires "Thu, 01 Jan 1970 00:00:00 GMT" 
    </IfModule> 
    FileETag MTime Size 
</FilesMatch> 
+0

這是我在stackoverflow上收到的最好的答案。我會在星期一嘗試它,謝謝! – prashn64 2012-07-21 08:46:50

+0

只是得到了這個工作,但我注意到我不得不刷新,以使最大年齡顯示在標題中。我應該將.htaccess文件添加到FilesMatch嗎? – prashn64 2012-07-23 16:30:03

+0

如果我理解你說的正確,那就是應該發生的事情。您的瀏覽器將緩存最大年齡標頭(和文件),並且不會與服務器重新檢查,直到最大使用期限結束。您之前沒有設置最大年齡,因此瀏覽器將無限期地緩存,並且在清除緩存之前,不會反映您的.htaccess更新。這是一個很長的說法:不用擔心,你做對了! – 2012-07-24 12:42:06

0

對於一個簡單的(非Drupal的)解決方案,你可以樣式元HREF重命名爲別的東西。例如。 的style.css?VERS = 1.0 ...的style.css?VERS = 1.1 ...的style.css?VERS = 1.1A ...等

爲Drupal擊中清除所有緩存按鈕會重新命名您的樣式表參考如上。 (config/development/performance)