12
JUNE
ウェブFRIDAY 2020 / 6 / 12
WP Fastest Cache の .htaccess を読み解いて、キャッシュの仕組みを見てみる
Text by Hiroyuki Matsumoto
WP Fastest Cache は .htaccess ファイルを書き換えてキャッシュ機能を使います。
その .htaccess を読み解くことで、キャッシュの仕組みを読み解いていこう!、という記事です。
まず読み解いた上でわかったことを先にまとめておきます。
自動的にキャッシュを無効化するケース
- WordPress管理者としてログインしている場合
- コメント機能を使っている場合
- 検索機能を使っている場合
- POST形式でデータが送信された場合
- ?foo=bar のようなパラメータが送信されている場合(=GET形式でデータが送信された場合)
- URL末尾が / でない場合
(http://example.com/hoge.html のようにURLを書き換えているとキャッシュされない) - Twitter / Facebook等のSNSからのBotアクセス
- HTML内に <!–- [wpfcNOT] -–> という記述がある場合
なお Contact Form 7 はキャッシュを有効化していてもフォーム送信可能でしたが、WP MW Form はキャッシュを有効化しているとフォーム送信できませんでした。
適宜キャッシュ除外設定を行う必要がありますね。
余談ではありますが、 WP Fastest Cache ではキャッシュを使いたくないページにて
wpfc_exclude_current_page() を実行させると、そのページではキャッシュを使用しなくなります。
参考: Exclude Pages from the Cache | WP Fastest Cache
・使用例1: トップページのみでキャッシュを使用する際 @ header.php
if(! is_frontpage()){ wpfc_exclude_current_page(); }
・使用例2: WP MW Form フォームのあるページでは自動的にキャッシュ無効化 @ function.php
add_action('mwform_start_main_process', 'wpfc_exclude_current_page');
以下は .htaccess を読み解いていきます。
先に言っておきますがわからない記述もちょいちょいありました。
# Start_WPFC_Exclude_Admin_Cookie
RewriteCond %{HTTP:Cookie} !wordpress_logged_in_[^\=]+\=【管理者名1】|【管理者名2】
管理者権限のあるユーザーにはキャッシュを適用しないよう既定動作をとります。そのため、 wordpress_logged_in_ で始まるCookieに記載されているユーザー名に管理者名が存在する場合はキャッシュを適用しないように記述されています。
なお、この Cookie は https で暗号化されたサイトの場合 secure属性が付与されるため、ブラウザの Cookie一覧やJavaScript からでは確認ができないことがあります。
RewriteCond %{HTTP_USER_AGENT} !(facebookexternalhit|WP_FASTEST_CACHE_CSS_VALIDATOR|Twitterbot|LinkedInBot|WhatsApp|Mediatoolkitbot)
RewriteCond %{HTTP_USER_AGENT} !(WP\sFastest\sCache\sPreload(\siPhone\sMobile)?\s*Bot)
いくつかの user-agent の場合はキャッシュを適用させないようにするようです。
1行目では Facebook / Twitter / LinkedIn / WhatsApp 等の bot アクセス、
2行目では WP Fastest Cache 自身がキャッシュの事前生成(preload)の際にキャッシュを使わないよう指定してあります。
botアクセスでキャッシュを使わないようにする意図を調べたところ、このページにて説明があり、曰く
Just the facebook bot does not see the cached version of the page.
(Facebook の bot がキャッシュされたページを無視するから)
と回答されていました。
RewriteCond %{REQUEST_METHOD} !POST
POSTメソッドでデータが送信されている場合はキャッシュを使いません。
検索機能やフォーム送信の際にキャッシュ結果を送信しないよう配慮されています。
RewriteCond %{REQUEST_URI} !(\/){2}$
URL末尾が // となっている場合はキャッシュを使いません、という意味ですが・・・・どういう状況なのだろうか。
RewriteCond %{REQUEST_URI} \/$
URL末尾が / の場合のみキャッシュを使います。
つまり、プラグイン等を使って、 http://example.com/hoge.html のようにURLを書き換えている場合はキャッシュされない仕様です。
RewriteCond %{QUERY_STRING} !.+
クエリ文字列が含まれている場合キャッシュを使いません。
http://example.com/?s=hoge のようなケースですね。
RewriteCond %{HTTP:Cookie} !comment_author_
コメント投稿が問題なく行えるように、という設定のようです。
RewriteCond %{HTTP:Cookie} !safirmobilswitcher=mobil
不明でした。www.wpfastestcache.com 内にも、wordpress.org のフォーラム内にも記述なしです。
おそらく User-Agent等によって表示内容を切り替える系のプラグインが設定する Cookie ではないかと思うのですが。
RewriteCond %{HTTP:Profile} !^[a-z0-9\”]+ [NC]
HTTP:Profile がどんな変数なのか不明でした。(探し方が悪いのだと思うのですが…)
この変数が 英数字か ” 以外で始まっている場合はキャッシュを適用しないという設定。
なお、調査環境ではこの変数には値が入っていませんでした(あるいは文字列 “”)ので、かなり特殊な環境を想定していると思われます。
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/all/$1/index.html -f [or]
RewriteCond /home/kaminaridon/yonago.tk/public_html/wp-content/cache/all/$1/index.html -f
2行ともキャッシュファイルが存在しているかを確認しています。
RewriteRule ^(.*) “/wp-content/cache/all/$1/index.html” [L]
キャッシュを使用する処理が記述されています。
TEXT by
松本 博之(まつもとひろゆき)
1978年、鳥取県米子市生まれ。
株式会社マジックワード WEBシステムの開発・運用を担当。
WordPressの実績多数。表面的な使用方法を把握するだけでなく、WordPressのソースコードを読み解いて対応できます。
国家資格の応用情報処理技術者をなんとなくとりました。