10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WordPressのuploadsにあるファイルへの直接アクセスを制限(WP新仕様対応)

Last updated at Posted at 2020-04-11

WooCommerceというWordPress用プラグインでショップを構築している。最近、デジタル商品(PDF)の販売もやり出しているのだが、一つ問題があって、WordPressはメディアファイルをアップロードすると/wp-content/uplaods/というディレクトリ以下にファイルが置かれるのだが、これには何も制限がかかってなくて、直接URLを入力したらファイルが表示されてしまう。これじゃ販売してる意味がないし、検索エンジンクローラーにも引っかかってしまう。

まぁFTP使って、直接アクセスできない領域に置けばいいじゃないかという話もあるのだが、諸事情からそれは見送り(詳細省きます)。次のような要件を.htaccessで実現することにした。

要件

  1. デジタル商品(.pdf、.mp3、.zip)へのアクセスは禁止
  2. ただし拡張子の前に_sampleと着いているものはアクセス可能。
    e.g. hoge_sample.pdf、hoge_sample.mp3、hoge_sample.zip
  3. リファラで自身のサイトからアクセスする場合はアクセス可能。

実際の.htaccessはこうなる

ネット検索すると<Files ~~~>で拡張子などを条件にアクセス制御しているが、同じ条件に当てはまっても例外を作る場合があまり見つからないようだ。次のように書いてみた。

.htaccess
SetEnvIf Referer "^https?://hoge-hoge\.com" mysite
<Files ~ "\.(pdf|mp3|zip)$">
order deny,allow
deny from all
allow from env=mysite
</Files>

<Files ~ "_sample\.(pdf|mp3|zip)$">
allow from all
</Files>

<Files>~</Files>が2つあるのがミソだ。簡単に解説する。

  • ””で囲った中身は正規表現
  • <Filesの後にある~(チルダ)が正規表現を使いますという意味
  • ダブルコーテーション中では拡張子に使う.はバックスラッシュ(Windowsなら円マーク)でエスケープしなくてはならない
  • SetEnvIfでリファラが""の中にあるものをmysiteという名前で呼ぶことにする(これなんていうの、エイリアス?環境変数?)。これをallow fromのところでenv=mysiteと指定する。
  • 2つめの<Files>~</Files>で例外を作る。この2つの<Files></Files>の順番を入れ替えると意図通りに動作しない。

この.htaccess/wp-content/uploads/に置けばOK。というわけで参考になればと思って大したことのないTipsですが、書いてみました。.htaccessってたまにしか書かないしね。では!

追記: Wordpress管理画面のメディアライブラリから表示させるときにはアクセス制限はかかりません。
追記2: root権限を持っているならhttpd.confに書き込んだ方が良い。プラグインやWordpress本体のアップデートで.htaccessが書き換わることがあるようだ。Debianなら/etc/apache2/sites-available/hoge.confなど。書き換えたらApacheは再起動する。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?