WooCommerceというWordPress用プラグインでショップを構築している。最近、デジタル商品(PDF)の販売もやり出しているのだが、一つ問題があって、WordPressはメディアファイルをアップロードすると/wp-content/uplaods/
というディレクトリ以下にファイルが置かれるのだが、これには何も制限がかかってなくて、直接URLを入力したらファイルが表示されてしまう。これじゃ販売してる意味がないし、検索エンジンクローラーにも引っかかってしまう。
まぁFTP使って、直接アクセスできない領域に置けばいいじゃないかという話もあるのだが、諸事情からそれは見送り(詳細省きます)。次のような要件を.htaccessで実現することにした。
要件
- デジタル商品(.pdf、.mp3、.zip)へのアクセスは禁止
- ただし拡張子の前に_sampleと着いているものはアクセス可能。
e.g. hoge_sample.pdf、hoge_sample.mp3、hoge_sample.zip - リファラで自身のサイトからアクセスする場合はアクセス可能。
実際の.htaccessはこうなる
ネット検索すると<Files ~~~>
で拡張子などを条件にアクセス制御しているが、同じ条件に当てはまっても例外を作る場合があまり見つからないようだ。次のように書いてみた。
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は再起動する。