2010-12-01 103 views
3

我現在在我的虛擬主機使用此設置Apache的虛擬主機指令:優化的PageSpeed

<Location /> 
    SetOutputFilter DEFLATE 
    BrowserMatch ^Mozilla/4 gzip-only-text/html 
    BrowserMatch ^Mozilla/4\.0[678] no-gzip 
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 
    SetEnvIfNoCase Request_URI \ 
    \.(?:gif|jpe?g|png)$ no-gzip dont-vary 
    Header append Vary User-Agent env=!dont-vary 
</Location> 
<Directory /> 
    ExpiresActive On 
    ExpiresByType text/html "access plus 5 minutes" 
    ExpiresByType text/css "access plus 1 month" 
    ExpiresByType application/x-javascript "access plus 1 month" 
    ExpiresByType application/javascript "access plus 1 month" 
    ExpiresByType text/javascript "access plus 1 month" 
    ExpiresByType image/gif "access plus 1 month" 
    ExpiresByType image/png "access plus 1 month" 
    ExpiresByType image/jpg "access plus 1 month" 
    ExpiresByType image/jpeg "access plus 1 month" 
    ExpiresByType image/x-icon "access plus 1 month" 
    ExpiresDefault "access plus 1 day" 

    <FilesMatch "\.(ico|jpeg|pdf|flv|jpg|png|gif|js|css|swf)$"> 
    Header set Cache-Control "max-age=2592000, public" 
    Header unset Last-Modified 
    Header unset ETag 
    FileETag None 
    </FilesMatch> 
    <FilesMatch "\.(html|php)$"> 
    Header set Cache-Control "max-age=900, public, must-revalidate" 
    </FilesMatch> 
</Directory> 

雖然它的偉大工程,對於加快的東西,有時用戶沒有看到他們themselfs上的內容所做的修改(主要是在使用火狐):(任何建議/優化提示?

回答

0

這裏的問題是瀏覽器緩存你的JavaScript,CSS和圖像,因此將不知道你是否已經在服務器,除非緩存過期修改任何東西。

對於例如,考慮你哈有一個名爲script.js的JS文件。根據你在你的htaccess文件有下列規則,

ExpiresByType application/x-javascript "access plus 1 month" 
ExpiresByType application/javascript "access plus 1 month" 

的JavaScript文件緩存一個月,因此沒有新的請求將被要求爲JS文件1個月,除非緩存被手動清除。

如何解決這個問題。

假設你的文件名的script.js,在HTML文件中,應包括作爲

<script src="includes/script.100.js" type="text/javascript"></script> 

<link rel="stylesheet" type="text/css" href="includes/style.100.css" /> 

100可以是任何數字。我通常會增加,如果從1,2,3 ..等等(版本號要精確)。現在

,在我htaccess的,我有這樣的事情

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^includes/style\.[\d]+\.css$ /includes/style.css [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^includes/script\.[\d]+\.js$ /includes/script.js [L] 

上述兩個條件保證了實際的文件時,不管是文件名和文件類型之間使用的號碼。

這確保了每次更改時,一旦更改版本號,舊的所有緩存都會過期,所有用戶都會看到最新的代碼。

+0

抱歉,但是這是沒有問題的,所有圖像包含時間戳在創建時/變更/新格式創建的,也是這樣做的CSS和JS文件,由於有壓縮和釋放過程重命名,這個問題我「M面向是我所描述的,用戶改變內容(存儲在通過PHP生成的HTML網頁中示出的分貝的內容)後,他所做的更改/從後端重定向到頁面上他沒有看到前端除非他對頁面進行了硬刷新(並且不是,它不是服務器緩存[memcached/apc]問題) – Hannes 2010-12-13 08:50:01

0

發佈,這個問題是基於內容,而不是在JS/CSS文件從漢納斯的答覆後,這條評論...

我有這個問題一次,但不能明確瞭解什麼是個問題。我認爲,原因可能是HTML頁面被緩存在我和瀏覽器之間的代理服務器的某處。因此,我所做的是生成一個查詢參數稱爲哈希,其中有像md5(時間(「U」))的網址;

例如,它有同樣的問題的URL是像

http://test.com/controller/functionname/

本次發行後,我改變了讓所有的用戶點擊網址是一樣的東西

http://test.com/controller/functionname/?hash= {東西}。

我希望能爲你解決問題。另外要確保你可以添加你的網頁。

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
1

而不是強制瀏覽器緩存,你應該從你的編程語言(例如,PHP)內通過發送Expires和Last-Modified頭髮送一個必須重新驗證報頭和控制緩存。然後瀏覽器會詢問您的網站每個請求的最新版本,但如果沒有任何更改,請確保用空白頁面回答。

這可能需要一些時間來執行,但它絕對適用。