「CSSを変更したのに、デザインが変わらない…」 「画像を差し替えたのに、古い画像が表示される」 「お客様から『更新されてない』とクレームが…」
これ、ブラウザキャッシュが原因です。
でも「Ctrl+F5で更新してください」って お客様に言うわけにはいきませんよね。
この記事を読めば、 .htaccessファイル1つで、キャッシュ問題を完全解決できます。
訪問者は常に最新のサイトを見られるようになりますよ!
そもそもキャッシュって何?なぜ必要なの?

キャッシュ = 一時保存データ
キャッシュの仕組み:
訪問者がサイトにアクセスすると…
- ブラウザがファイルをダウンロード
- パソコンに一時保存(キャッシュ)
- 次回アクセス時は保存データを表示
メリット: ✅ 表示速度が速い ✅ データ通信量が減る ✅ サーバー負荷が軽い
デメリット: ❌ 更新が反映されない ❌ 古い情報が表示される ❌ エラーが残り続ける
つまり、キャッシュは諸刃の剣なんです。
.htaccessでキャッシュをコントロール
.htaccessファイルとは:
- Apacheサーバーの設定ファイル
- ディレクトリごとに配置可能
- サーバーの動作を細かく制御
これを使えば、 キャッシュの有効期限を自由に設定できます!
【即効】キャッシュを無効化するコード
完全にキャッシュを無効にする設定
すべてのファイルでキャッシュ無効:
# キャッシュを完全に無効化
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
<FilesMatch "\.(html|htm|js|css|json|xml|txt)$">
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
</FilesMatch>
このコードの意味:
no-cache
:キャッシュを使わないno-store
:保存しないmust-revalidate
:必ず最新版を確認Pragma
:古いブラウザ対応Expires 0
:即座に期限切れ
開発中だけキャッシュ無効にする
開発環境向けの設定:
# 開発環境でのキャッシュ無効化
<IfModule mod_env.c>
SetEnv ENVIRONMENT development
</IfModule>
<If "%{ENV:ENVIRONMENT} == 'development'">
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, private"
Header set X-Dev-Mode "true"
</IfModule>
</If>
本番環境では別の設定を使いましょう!
【推奨】ファイルタイプ別のキャッシュ設定
最適なキャッシュ期間を設定する
実用的なキャッシュ設定:
# ファイルタイプごとに最適化
<IfModule mod_expires.c>
ExpiresActive On
# HTMLファイル:キャッシュしない
ExpiresByType text/html "access plus 0 seconds"
# CSS/JavaScript:1週間
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
# 画像ファイル:1ヶ月
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
# フォント:1年
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
ExpiresByType application/font-woff2 "access plus 1 year"
# その他:1日
ExpiresDefault "access plus 1 day"
</IfModule>
なぜファイルタイプで期間を変える?
ファイルタイプ | 推奨期間 | 理由 |
---|---|---|
HTML | 0秒〜1時間 | 頻繁に更新される |
CSS/JS | 1週間〜1ヶ月 | 時々更新される |
画像 | 1ヶ月〜1年 | めったに変更しない |
フォント | 1年 | ほぼ変更しない |
バージョン管理でキャッシュを強制更新
クエリパラメータを使った賢い方法
ファイル名は変えずにキャッシュを更新:
<!-- バージョン番号を追加 -->
<link rel="stylesheet" href="style.css?v=1.2.3">
<script src="script.js?v=2024.01.15"></script>
<img src="logo.png?v=2">
自動化する方法(PHP):
<?php
// ファイルの更新時刻を自動付与
$version = filemtime('style.css');
?>
<link rel="stylesheet" href="style.css?v=<?php echo $version; ?>">
これで、ファイルを更新すると 自動的に新しいバージョンとして認識されます!
.htaccessでバージョン管理を補助
# バージョン付きURLを処理
<IfModule mod_rewrite.c>
RewriteEngine On
# style.1234567890.css → style.css
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(css|js|jpg|jpeg|png|gif)$ $1.$3 [L]
</IfModule>
ブラウザごとの対応方法
主要ブラウザ対応コード
すべてのブラウザで確実に動作:
<IfModule mod_headers.c>
# 標準的なキャッシュ制御
Header set Cache-Control "max-age=0, private, must-revalidate"
# 古いブラウザ対応
Header set Pragma "no-cache"
# プロキシキャッシュ対策
Header set Vary "Accept-Encoding"
# IE特有の問題対策
Header set X-UA-Compatible "IE=edge"
# キャッシュの検証を強制
<FilesMatch "\.(html|htm)$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
</FilesMatch>
</IfModule>
CDNを使用している場合
CloudflareやCDN利用時の設定:
# CDNキャッシュをパージ
<IfModule mod_headers.c>
# CloudflareのキャッシュをバイパスS
Header set Cache-Control "no-cache, no-store, must-revalidate, s-maxage=0"
# CDNに対する指示
Header set CDN-Cache-Control "no-cache"
Header set Cloudflare-CDN-Cache-Control "no-cache"
</IfModule>
トラブルシューティング

.htaccessが効かない場合
確認すべきポイント:
- mod_headersが有効か確認
# テスト用コード
<IfModule mod_headers.c>
Header set X-Test-Header "Working"
</IfModule>
- AllowOverrideの設定
- サーバー設定で.htaccessが許可されているか
- レンタルサーバーの管理画面で確認
- ファイル名と配置場所
- ファイル名は「.htaccess」(ドットから始まる)
- ドキュメントルートに配置
特定のファイルだけキャッシュされる
個別ファイルの強制更新:
# 特定ファイルのキャッシュ無効化
<Files "problem-file.css">
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store"
Header set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
</IfModule>
</Files>
# ワイルドカードも使用可能
<FilesMatch "^(style|script)\.(css|js)$">
Header set Cache-Control "no-cache"
</FilesMatch>
WordPressサイトの場合
WordPress専用の設定:
# WordPress向けキャッシュ設定
<IfModule mod_expires.c>
ExpiresActive On
# 管理画面はキャッシュしない
<Directory /wp-admin>
ExpiresByType text/html "access plus 0 seconds"
</Directory>
# テーマファイル
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
# メディアファイル
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
</IfModule>
# ログインユーザーはキャッシュしない
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store" "expr=%{HTTP_COOKIE} =~ /wordpress_logged_in/"
</IfModule>
セキュリティも考慮した設定
機密情報を含むページの設定
個人情報や機密データがある場合:
# セキュアなキャッシュ設定
<FilesMatch "\.(php|cgi|pl|htm|html)$">
<IfModule mod_headers.c>
# キャッシュ完全無効化
Header set Cache-Control "no-cache, no-store, must-revalidate, private"
Header set Pragma "no-cache"
Header set Expires 0
# セキュリティヘッダー追加
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
Header set X-XSS-Protection "1; mode=block"
</IfModule>
</FilesMatch>
パフォーマンスとのバランス
最適なキャッシュ戦略
サイトタイプ別の推奨設定:
ニュースサイト・ブログ:
- HTML:10分〜1時間
- CSS/JS:1日〜1週間
- 画像:1ヶ月
ECサイト:
- HTML:キャッシュなし
- CSS/JS:1週間
- 商品画像:1週間
企業サイト:
- HTML:1日
- CSS/JS:1ヶ月
- 画像:3ヶ月
モバイル対応の考慮
# モバイルデバイス向け設定
<IfModule mod_headers.c>
# レスポンシブ対応
Header append Vary "User-Agent"
# モバイルは短めのキャッシュ
SetEnvIf User-Agent "Mobile|Android|iPhone" IS_MOBILE
Header set Cache-Control "max-age=3600" env=IS_MOBILE
</IfModule>
まとめ:目的別.htaccess設定
開発中:
Header set Cache-Control "no-cache, no-store, must-revalidate"
本番サイト(バランス型):
ExpiresActive On
ExpiresByType text/html "access plus 1 hour"
ExpiresByType text/css "access plus 1 week"
ExpiresByType image/jpeg "access plus 1 month"
高速化重視:
ExpiresActive On
ExpiresByType text/html "access plus 1 day"
ExpiresByType text/css "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 year"
キャッシュ制御をマスターすれば、 サイトの表示速度と更新の即時性を 両立できます。
まずは開発環境で試して、 本番環境では慎重に調整していきましょう。
快適なWebサイト運営を!
この設定でサイトが改善したら、ぜひ効果を教えてください。みんなで最適な設定を共有しましょう!
コメント