Apache HTTPD mod_expires設定,管理用戶端暫存檔時間

2024-12-20

mod_expires 是 Apache 網頁伺服器的模組,用於設定 HTTP header 中的 Expires 或 Cache-Control 標籤。

這些標籤告訴瀏覽器針對各種檔案的暫存(快取)時間。透過正確的配置,網站可減少伺服器負載、提升網站速度,並改善用戶體驗。

1.檢查是否有載入 mod_expires 模組

通常設定在檔案:

/etc/httpd/conf.modules.d/00-base.conf

LoadModule expires_module modules/mod_expires.so

重新啟動 Apache

$ apachectl graceful

使用命令列,檢查是否已載入 mod_expires

$ apachectl -M | grep expires
 expires_module (shared)



2.在 .htaccess 或 httpd.conf 設定

分別設定各檔案格式的暫存時間

設定完後,即可生效

這套用於用戶對各檔案格式的暫存時間:

<IfModule mod_expires.c>
  ExpiresActive On

  # Images
  ExpiresByType image/jpeg "access plus 8 weeks"
  ExpiresByType image/gif "access plus 8 weeks"
  ExpiresByType image/png "access plus 8 weeks"
  ExpiresByType image/webp "access plus 8 weeks"
  ExpiresByType image/svg+xml "access plus 8 weeks"
  ExpiresByType image/x-icon "access plus 8 weeks"

  # Video
  ExpiresByType video/webm "access plus 1 year"
  ExpiresByType video/mp4 "access plus 1 year"
  ExpiresByType video/mpeg "access plus 1 year"
  ExpiresByType video/ogg "access plus 1 week"

  # Fonts
  ExpiresByType font/ttf "access plus 1 year"
  ExpiresByType font/otf "access plus 1 year"
  ExpiresByType font/woff "access plus 1 year"
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType application/font-woff "access plus 1 year"

  # TEXT, HTMML, CSS, JavaScript
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"

  ExpiresByType text/html "access plus 1 year"
  ExpiresByType text/xml  "access plus 1 year"
  ExpiresByType text/plain "access plus 1 year"

  # Others
  ExpiresByType application/pdf "access plus 1 year"
  ExpiresByType image/vnd.microsoft.icon "access plus 1 year"

</IfModule>

可使用的各種單位:
    year
    month
    week
    day
    hour
    minute
    second


另其它寫法:


  ExpiresByType text/html A86400
  ExpiresByType text/html M86400

    A: access 指現在起  +86400 秒(1天) 當暫存到期日 
  M: modification 指針對相關檔案最後修改時間起, +86400 秒(1天) 當暫存到期日
   **用 M 會造成的小問題是,若你檔案是 1個月前修改,那用戶端 就等於永不會暫存此檔案

或
  ExpiresByType text/html "access plus 1 month 15 days 2 hours"

  ExpiresByType image/gif "modification plus 5 hours 3 minutes"


3.檢查 mod_expires 是否正常運作

$ curl -I https://www.xxxx.tw/images/logo.png
HTTP/2 200
date: Sat, 21 Dec 2024 01:38:06 GMT
content-type: image/png
content-length: 3322
x-content-type-options: nosniff
last-modified: Thu, 05 Dec 2024 00:34:35 GMT
etag: "cfa-6287b1005cd4c"
cache-control: max-age=5184000         <==8 weeks
expires: Tue, 18 Feb 2025 04:53:41 GMT
:::

expires 即是 /images/logo.png 到期日


針對特定目錄,給不同的到期日

例如 針對 /upoad 目錄的 jpeg/png/mp4 檔案,設定為 5分鐘

<Directory "/var/www/html/upload">
  Options FollowSymLinks
  AllowOverride All

  <IfModule mod_expires.c>
      ExpiresActive On
      ExpiresByType image/jpeg  "access plus 5 minutes"
      ExpiresByType image/png   "access plus 5 minutes"
      ExpiresByType video/mp4   "access plus 5 minutes" 
  </IfModule>
</Directory>

或是

<VirtualHost *:443>
  DocumentRoot /var/www/html
  ServerName www.abc.com

  <IfModule mod_expires.c>
      ExpiresActive On
      <Location "/upload">
      ExpiresByType image/jpeg  "access plus 5 minutes"
      ExpiresByType image/png   "access plus 5 minutes"
      ExpiresByType video/mp4   "access plus 5 minutes" 
      </Location>
  </IfModule>

</VirutalHost>


參考:

官方文件 mod_expires - Apache HTTP Server Version 2.4

https://stackoverflow.com/questions/77338374/old-expiresbytype-in-htaccess-causes-page-layout-break-how-to-force-the-browse

note HTTP Cache 快取

分類:雲端      401
Tag httpd , ExpiresActive , Aapache , mod_expires , 暫存 ,
留言

留言