wpX Speedのサーバーキャッシュ|除外される条件を自分のURLで判定

wpX Speedは、サーバー側の「リバースプロキシ」でページをキャッシュ(保存しておいて使い回す)ことで、表示を速くしています。ただ、すべてのページがキャッシュされるわけではなく、管理画面・REST API・フィード・サイトマップや、ログインしている人のアクセスなど、除外される条件がマニュアルに決まっています。逆に、キャッシュされると困るページ(一部の人にだけ見せるページなど)もあります。この記事では、除外条件を整理し、実際のサイトのURLに当てはめて、どのページがキャッシュされるかを判定します。

(確認:wpX Speed マニュアル「サーバーキャッシュ」。確認日:2026年10月30日。判定は、当サイト realine.net のURLに対して同日に実行。当サイトはwpX Speedではないため、実際にwpX Speedでキャッシュされたかは確かめていません)

マニュアルに書かれている仕様

項目 マニュアルの記載
仕組み リバースプロキシによるキャッシュ
対象 動的ページ(主にPHP)、静的ページ(画像・CSSなど)、404ページ。URLごとに保存し、スマートフォン用はパソコンと別に保存
更新 一定時間ごと。コメントの投稿やページの更新があった時も更新する
除外(アクセス) ログインページ・管理画面へのアクセス、ログインに関係するクッキー(wordpress_logged_in など)があるアクセス、Ajax、HEAD・GET以外の方法、ベーシック認証・ダイジェスト認証をかけたページ、フィーチャーフォンからのアクセス
除外(応答) レスポンスヘッダーに「private」がある場合、200・404以外のステータスの場合
除外(URI) /wp-admin/、/wp-json/、/wp-*.php、/xmlrpc.php、/feed/、sitemap.xml、sitemap_index.xml、/cart/、/checkout/ などのショッピングの画面 ほか

マニュアルには注意として、特定のIPアドレスやブラウザにだけ見せるように .htaccess で制限しているページがあると、本来は公開していないデータがキャッシュされ、別の人が見られるようになることがある、と書かれています。会員制・ショッピングのような人ごとに表示が違うページでは、速くなる効果が出にくい、ともあります。

コード:URLごとに判定する

除外条件のうち、URIのパターン・ステータス・「private」のヘッダーの3つを、ログインしていない状態のアクセスで調べます。パターンの照合のしかたはマニュアルに書かれていないため、「URLにその文字列が含まれるか」で判定しています。

# wpX Speed のサーバーキャッシュの「除外条件」(公式マニュアル)を、実際のサイトのURLに当てはめて、キャッシュされるかを判定する(読み取りのみ)
# 判定に使う条件:URIのパターン/HTTPステータスが200・404以外/レスポンスヘッダーに private
# (ログインのクッキー・Ajax・HEAD/GET以外は、ログインしていない GET で調べるので当てはまらない)
# パターンの照合は「URLに含まれるか」で行う(マニュアルの照合方法は書かれていないため、筆者の簡略化)
import re
import sys
import urllib.request
import urllib.error

EXCLUDE_URI = ['/wp-admin/', '/wp-json/', '/wp-*.php', '/xmlrpc.php', '/feed/', 'sitemap.xml', 'sitemap_index.xml',
               '/wp-content/plugins/siteguard', '/login_*', '/store/', '/cart/', '/my-account/', '/checkout/', '/addons/',
               '?wptouch_switch=mobile', '?wptouch_switch=desktop', '/usces-cart/', '/usces-member/']
UA = {'User-Agent': 'Mozilla/5.0 (cache-check)'}


def pattern_hit(url):
    for p in EXCLUDE_URI:
        rx = re.escape(p).replace(r'\*', '[^/]*')   # 「*」は任意の文字列
        if re.search(rx, url):
            return p
    return None


def fetch(url):
    req = urllib.request.Request(url, headers=UA)
    try:
        with urllib.request.urlopen(req, timeout=20) as r:
            return r.status, r.headers.get('Cache-Control', '')
    except urllib.error.HTTPError as e:
        return e.code, e.headers.get('Cache-Control', '')


site = sys.argv[1] if len(sys.argv) > 1 else 'https://realine.net'
paths = ['/', '/guide/', '/mt5-ea-install/', '/category/wordpress/', '/feed/', '/sitemap.xml',
         '/wp-json/wp/v2/posts?per_page=1', '/wp-login.php', '/no-such-page-xyz/', '/?s=MT5']
print(f'{"URL":<38}{"状態":>5}  {"判定":<10}理由')
for p in paths:
    url = site + p
    st, cc = fetch(url)
    hit = pattern_hit(p)
    if hit:
        verdict, why = '除外', f'URIのパターン {hit}'
    elif st not in (200, 404):
        verdict, why = '除外', f'ステータス {st}'
    elif 'private' in cc.lower():
        verdict, why = '除外', f'Cache-Control: {cc}'
    else:
        verdict, why = 'キャッシュ', f'Cache-Control: {cc or "(なし)"}'
    print(f'{p:<38}{st:>5}  {verdict:<10}{why}')

実行の結果(realine.net に当てはめた場合)

URL                                      状態  判定        理由
/                                       200  キャッシュ     Cache-Control: (なし)
/guide/                                 200  キャッシュ     Cache-Control: (なし)
/mt5-ea-install/                        200  キャッシュ     Cache-Control: (なし)
/category/wordpress/                    200  キャッシュ     Cache-Control: (なし)
/feed/                                  200  除外        URIのパターン /feed/
/sitemap.xml                            200  除外        URIのパターン sitemap.xml
/wp-json/wp/v2/posts?per_page=1         200  除外        URIのパターン /wp-json/
/wp-login.php                           200  除外        URIのパターン /wp-*.php
/no-such-page-xyz/                      404  除外        Cache-Control: no-cache, must-revalidate, max-age=0, no-store, private
/?s=MT5                                 200  キャッシュ     Cache-Control: (なし)
  • トップ・記事・カテゴリーのページは、除外条件に当たらないため、キャッシュの対象になる
  • フィード・サイトマップ・REST API・ログイン画面は、URIのパターンで除外される。自動投稿などで REST API を使う処理は、キャッシュの影響を受けない
  • 存在しないページ(404)は、マニュアルでは対象だが、当サイトでは WordPress が「private」を含むヘッダーを返していたため、この条件で除外される
  • サイト内検索の結果(/?s=)は除外条件に当たらず、キャッシュの対象になる。検索結果の更新が遅れる場合があると考えられる(筆者の推定)

移す前に確かめること(筆者の考え)

  • 人によって表示を変えているページ:.htaccess のIP制限や、プラグインでの出し分けがあるなら、キャッシュから外す設定(マニュアルの「サーバーキャッシュ設定」)を考える
  • 記事を直したのに古い表示が出る時:ページの更新でキャッシュも更新されるとあるが、反映を確かめる時は、ログアウトした状態の別のブラウザでも見る
  • 速さを比べる時:キャッシュされたページと、されないページで速さが違う。比べる時は同じ種類のページで測る(curlでTTFBを測る方法)

この記事で確かめていないこと

  • wpX Speedで、キャッシュされたかどうかを外から見分ける方法(応答のヘッダーなど)
  • キャッシュの「一定時間」の長さ
  • URIのパターンの照合のしかた(前方一致か、含むか)

まとめ

  • wpX Speedのサーバーキャッシュは、記事・画像・404ページなどをURLごとに保存し、ログインしている人・管理画面・REST API・フィード・サイトマップなどは除外する
  • 当サイトのURLに当てはめると、記事・カテゴリー・検索結果はキャッシュの対象、REST API・フィード・サイトマップ・ログイン画面は除外
  • .htaccess で一部の人にだけ見せているページは、キャッシュで別の人に見える場合があるので、移す前に確かめる

本記事はwpX Speedの公式マニュアルの記載と、当サイトのURLへの当てはめにもとづく整理です。料金とプランの仕組みはwpX Speedの料金とプランにまとめています。