WordPress のサイトヘルスでは「検出できない」と表示される
nginx + fastcgi_cache を使っている場合、実際にはキャッシュされていても WordPress のサイトヘルスでは「検出できない」と表示されることがよくあります。
これは WordPress がキャッシュの有無を HTTP ヘッダで判定しているためです。
原因
WordPress のサイトヘルスは、以下のようなヘッダを見て判定します。
• x-cache
• x-cache-enabled
• cf-cache-status
• x-litespeed-cache
• など
しかし、素の nginx fastcgi_cache は キャッシュヒット時に何もヘッダを出しません。
そのため:
実際はキャッシュしている
でも WordPress からは「検出できない」
という状態になります。
解決方法
キャッシュ状態ヘッダを追加する
nginx の設定ファイル内の server または location ブロックに追加します。
add_header X-Cache $upstream_cache_status;
例:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 1h;
add_header X-Cache $upstream_cache_status;
}
nginx 再起動
変更した設定をNginxで反映させる
sudo nginx -t
sudo systemctl reload nginx
動作確認
ブラウザPCのターミナルから確認してみる。
curl -I https://example.com
表示例:
X-Cache: HIT
初回表示では、キャッシュされていないので、2度以上ターミナルから
curl -I https://example.com
を行うこと。
重要:fastcgi_cache の正しい除外設定
WordPress では以下を除外しないと問題が出ます:
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($http_cookie ~* "wordpress_logged_in|comment_author") {
set $skip_cache 1;
}
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
リバースプロキシ経由の場合
[Internet]
↓
[リバースプロキシ nginx]
↓
[バックエンド nginx + fastcgi_cache]
問題点
1. X-Cache ヘッダがバックエンドで付与される
2. しかしリバースプロキシがそれを引き継がない
3. WordPress は「キャッシュ無し」と判定する
必要な追加設定(プロキシ側)
キャッシュ状態ヘッダを引き継ぐ
リバースプロキシの Nginx設定の location に追加:
proxy_pass https://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ★ これが重要
proxy_pass_header X-Cache;
curl では OK なのに WordPressではダメ
curl -I https://example.com ->> X-Cache: HIT
だけど、Wordpress ツール/サイトヘルスでは、ページキャッシュが無いと表示される
おすすめ最適解(シンプル)
バックエンドにこれを入れるだけでOKです:
add_header X-Proxy-Cache $upstream_cache_status always;
add_header Cache-Control "public, max-age=3600";
WEBサーバーの Nginx 設定のヘッダーについて書かれているところに、上の二行を追加する。




