.htaccessでキャッシュを完全制御!更新が反映されない問題を今すぐ解決する方法

Windows

「CSSを変更したのに、デザインが変わらない…」 「画像を差し替えたのに、古い画像が表示される」 「お客様から『更新されてない』とクレームが…」

これ、ブラウザキャッシュが原因です。

でも「Ctrl+F5で更新してください」って お客様に言うわけにはいきませんよね。

この記事を読めば、 .htaccessファイル1つで、キャッシュ問題を完全解決できます。

訪問者は常に最新のサイトを見られるようになりますよ!


スポンサーリンク

そもそもキャッシュって何?なぜ必要なの?

キャッシュ = 一時保存データ

キャッシュの仕組み:

訪問者がサイトにアクセスすると…

  1. ブラウザがファイルをダウンロード
  2. パソコンに一時保存(キャッシュ)
  3. 次回アクセス時は保存データを表示

メリット: ✅ 表示速度が速い ✅ データ通信量が減る ✅ サーバー負荷が軽い

デメリット: ❌ 更新が反映されない ❌ 古い情報が表示される ❌ エラーが残り続ける

つまり、キャッシュは諸刃の剣なんです。

.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>

なぜファイルタイプで期間を変える?

ファイルタイプ推奨期間理由
HTML0秒〜1時間頻繁に更新される
CSS/JS1週間〜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が効かない場合

確認すべきポイント:

  1. mod_headersが有効か確認
# テスト用コード
<IfModule mod_headers.c>
    Header set X-Test-Header "Working"
</IfModule>
  1. AllowOverrideの設定
  • サーバー設定で.htaccessが許可されているか
  • レンタルサーバーの管理画面で確認
  1. ファイル名と配置場所
  • ファイル名は「.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サイト運営を!


この設定でサイトが改善したら、ぜひ効果を教えてください。みんなで最適な設定を共有しましょう!

コメント

タイトルとURLをコピーしました