WordPressプラグイン「All In One WP Security」で直リンク防止設定し、公開後に画像が表示されなくなる不具合の原因
現象
試作サイトをドキュメントルートの下層の「WordPress」ディレクトリという位置で制作し、ドキュメントルートで公開したところ画像が表示されなくなりました。
いろいろ調査したところ以下のような特徴があることが判かりました。
- サイトアドレスを元の「WordPress」に戻すと正常に表示される。
- 該当画像のURLを直接ブラウザに入力して一旦表示させると、ウェブページにも表示される。
- 表示される画像と表示されない画像がある。
原因
プラグイン「All In One WP Security」で画像の直リンク防止のコードが不適切に作用しているためでした。設定項目は以下のスクショ参照のこと。
「All In One WP Security」の利用は以下の順番で実行しました。
- 試作サイト「WordPress」ディレクトリで制作中にプラグイン「All In One WP Security」をインストールした。
- その場でプラグイン「All In One WP Security」の直リンク防止の設定を含む設定を実行した。
- ドキュメントルートに移行(サイト公開)した。
- プラグイン「All In One WP Security」の再設定した。
2での設定はディレクトリ「WordPress」の.htaccessに反映されます。4での設定はドキュメントルートの.htaccessに反映されます。4で設定してもディレクトリ「WordPress」の.htaccessの設定は無効とはならず、以下の内容が記述されたままとなっていました。
1 2 3 4 5 6 7 8 9 10 |
#AIOWPS_PREVENT_IMAGE_HOTLINKS_START <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$ [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://sample\.com/WordPress [NC] RewriteRule \.(gif|jpe?g?|png)$ - [F,NC,L] </IfModule> #AIOWPS_PREVENT_IMAGE_HOTLINKS_END |
要するに「https://sample.com/WordPress」がマッチするリクエストでないと画像ファイルはアクセス不許可ということです。
具体的には公開サイトのリクエストは「https://sample.com/xxxxxx」となり、「WordPress」が無いためにマッチしません。
対策
ディレクトリ「WordPress」の.htaccessの「All In One WP Security」による記述をすべて削除しました。
正しい直リンク防止の記述は以下の通りです。これがドキュメントルートの.htaccessに記述されていて、ディレクトリ「WordPress」の.htaccessに記述されていなければ直リンク防止は正常動作します。
1 2 3 4 5 6 7 8 9 10 |
#AIOWPS_PREVENT_IMAGE_HOTLINKS_START <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$ [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://sample\.com [NC] RewriteRule \.(gif|jpe?g?|png)$ - [F,NC,L] </IfModule> #AIOWPS_PREVENT_IMAGE_HOTLINKS_END |
まとめ
「All In One WP Security」の設定は公開後に実行するのが適切です。
膨大な直リンクアクセスがあるわけではないにもかかわらず、たまたま「All In One WP Security」に直リンク不許可の設定があったのでついつい利用してしまったものの、設定のタイミングが不適切であったため弊害の方が大きくなってしまったという顛末です。
試作サイト段階での設定が亡霊のように有効になったままの状態で存在し続けるという、他のプラグインにおいても起こりうる教訓として頭の片隅にでも置いていただければ幸いです。
参考までに現象の説明を記述しておきます。
- サイトアドレスを元の「WordPress」に戻すと正常に表示される。
→リクエストが「https://sample.com/WordPress」がマッチするため。 - 該当画像のURLを直接ブラウザに入力して一旦表示させると、ウェブページにも表示される。
→ブラウザに画像がキャッシュされるため。 - 表示される画像と表示されない画像がある。
→RewiteCondに指定したもの以外の拡張子を持つ画像は表示される。
(※ 当ページは社内技術資料としての位置付けですので読みにくいこともあるかもしれませんが、一般の方の課題解決に役立てれば幸いです。)