依據 Yahoo! Best Practices 34 條規範中的 3 項伺服器層面建議,透過 mod_headers、mod_expires、mod_deflate 模組大幅降低頁面載入時間。
LoadModule headers_module modules/mod_headers.so
# 固定過期時間 (相容舊瀏覽器)
Header set Expires "Thu, 15 Apr 2026 20:00:00 GMT"
# Cache-Control: max-age=604800 (7 天) — 現代瀏覽器優先
Header set Cache-Control "max-age=604800, public"
LoadModule expires_module modules/mod_expires.so
ExpiresActive On
ExpiresDefault "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/css "access plus 3 days"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/plain "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType video/x-flv "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType text/html "access plus 1 week"
建議採用方案 B,語意清晰且自動處理日期計算。
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
# 僅壓縮文字類 MIME,避免二進位檔二次壓縮
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml
# 針對副檔名補充
AddOutputFilter DEFLATE html xml css js json
# 瀏覽器相容:排除已知有問題的 User-Agent (可選)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
FileETag None
叢集環境下,不同節點產生的 Inode/Size/Time 組合 ETag 不同,導致瀏覽器誤判需重新下載。關閉後完全依賴 Expires/Cache-Control。
Cache-Control: max-age=604800、Content-Encoding: gzip、無 ETag。from disk cache / 304 Not Modified。Cache-Control: no-store, private。DeflateCompressionLevel。