Konfigurasikan mod_expires atau mod_headers pada origin server Apache Anda untuk mengatur header respons Cache-Control dan Expires, sehingga node edge Alibaba Cloud CDN dan browser menyimpan cache konten statis Anda dengan TTL (Time to Live) yang tepat.
Pilih modul
Apache menyediakan dua modul untuk mengontrol header cache. Pilih berdasarkan kebutuhan Anda:
|
Modul |
Kelebihan |
Kekurangan |
Kapan digunakan |
|
|
Sintaks sederhana; mengatur |
Tidak dapat mengatur direktif kompleks seperti |
Skema sederhana yang hanya memerlukan |
|
|
Kontrol penuh atas header |
Sintaks sedikit lebih kompleks |
Lingkungan produksi yang memerlukan kebijakan cache detail halus |
Prasyarat
Sebelum memulai, pastikan modul Apache yang diperlukan telah diaktifkan.
Periksa modul yang dimuat:
apachectl -M | grep -E "expires|headers"
Output harus mencakup expires_module dan headers_module. Jika salah satunya tidak ada, aktifkan modul tersebut:
Debian / Ubuntu:
sudo a2enmod headers expires
sudo systemctl restart apache2
CentOS / RHEL / Alibaba Cloud Linux:
Modul biasanya sudah dikompilasi secara default. Jika suatu modul tidak tersedia, periksa /etc/httpd/conf.modules.d/ dan pastikan baris LoadModule terkait tidak dikomentari, lalu restart Apache:
sudo systemctl restart httpd
Letakkan konfigurasi dalam file khusus di bawah /etc/httpd/conf.d/ (CentOS/RHEL) atau /etc/apache2/conf-available/ (Debian/Ubuntu)—misalnya, cache.conf. Hindari penggunaan file .htaccess: Apache mengurai .htaccess pada setiap permintaan, yang menambah beban berlebihan dan menghilangkan keuntungan performa yang ingin Anda capai.
Contoh konfigurasi
Semua contoh menggunakan penjaga <IfModule> agar Apache tetap dapat dimulai meskipun modul tidak tersedia. Ganti atau tambahkan baris ExpiresByType sesuai dengan tipe konten Anda.
Atur TTL cache berdasarkan tipe konten
Gunakan mod_expires untuk aturan max-age yang sederhana, atau mod_headers jika Anda memerlukan kontrol penuh atas Cache-Control.
mod_expires
<IfModule mod_expires.c>
ExpiresActive On
# TTL default untuk semua tipe konten
ExpiresDefault "access plus 1 day"
# Gambar: cache selama 1 bulan
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
# CSS dan JavaScript: cache selama 1 minggu
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
# Font: cache selama 1 tahun
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
# HTML dan data: jangan cache
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
</IfModule>
Setara mod_headers
<IfModule mod_headers.c>
# Gambar
<FilesMatch "\.(jpg|jpeg|png|gif|svg|webp)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
# CSS dan JavaScript
<FilesMatch "\.(css|js)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# Font
<FilesMatch "\.(woff|woff2)$">
Header set Cache-Control "max-age=31536000, public, immutable"
</FilesMatch>
# HTML dan data: tanpa caching
<FilesMatch "\.(html|json)$">
Header set Cache-Control "no-store"
</FilesMatch>
</IfModule>
Atur TTL default global
Jika sebagian besar konten Anda bersifat statis, atur default global dan sesuaikan jenis tertentu sesuai kebutuhan.
mod_expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 week"
</IfModule>
Setara mod_headers
<IfModule mod_headers.c>
Header set Cache-Control "max-age=604800, public"
</IfModule>
Nonaktifkan caching untuk konten dinamis
Cegah node edge CDN dan browser menyimpan cache respons yang berubah setiap permintaan.
mod_expires
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
</IfModule>
Setara mod_headers
<IfModule mod_headers.c>
<FilesMatch "\.(html|json|php)$">
Header set Cache-Control "no-store"
</FilesMatch>
</IfModule>
Referensi direktif
Direktif mod_expires
|
Direktif |
Deskripsi |
|
|
Mengaktifkan pembuatan header |
|
|
Mengatur TTL default untuk semua tipe konten yang tidak sesuai dengan |
|
|
Mengatur TTL untuk tipe MIME tertentu |
Opsi basis waktu:
|
Nilai |
Makna |
|
|
TTL dihitung dari waktu permintaan |
|
|
TTL dihitung dari timestamp terakhir file dimodifikasi |
Unit durasi: years, months, weeks, days, hours, minutes, seconds
Nilai durasi umum:
|
Ekspresi |
Ekuivalen |
Kasus penggunaan |
|
|
31.536.000 detik |
Aset versi dengan nama file cache-busting |
|
|
2.592.000 detik |
Gambar dan aset lain yang jarang diperbarui |
|
|
604.800 detik |
File CSS dan JavaScript |
|
|
Tanpa caching |
Laman HTML dan respons API |
Verifikasi konfigurasi
Setelah memuat ulang Apache, pastikan header tersebut muncul dalam respons:
curl -I https://<your-domain>/path/to/static-file.jpg
Cari Cache-Control atau Expires dalam output:
HTTP/1.1 200 OK
Cache-Control: max-age=2592000, public
Expires: Thu, 10 Jul 2026 04:00:00 GMT
Alternatifnya, buka Chrome DevTools, buka tab Network, muat ulang halaman, lalu klik sumber daya statis. Panel Response Headers menampilkan nilai Cache-Control dan Expires yang ditetapkan oleh konfigurasi Anda.
Praktik terbaik
Lebih baik gunakan
mod_headersuntuk produksi. Modul ini mendukung seluruh rentang direktifCache-Control(no-store,immutable,stale-while-revalidate) yang tidak dapat dihasilkan olehmod_expires.Gunakan TTL panjang untuk aset versi. Jika pipeline build Anda menambahkan hash ke nama file (misalnya,
app.a1b2c3.js), atur TTL satu tahun atau lebih. Perubahan nama file berfungsi sebagai mekanisme cache-busting.Atur
no-storeuntuk laman HTML dan respons API. Ini memastikan browser dan node edge CDN selalu mengambil struktur halaman dan data terbaru.Muat ulang, jangan restart. Setelah mengedit file konfigurasi, jalankan
apachectl graceful(atausystemctl reload apache2/systemctl reload httpd) untuk menerapkan perubahan tanpa memutus koneksi aktif.Uji dengan
curl -Isebelum ke produksi. Verifikasi header pada setiap tipe konten yang Anda konfigurasikan, bukan hanya satu jenis saja.