.htaccess SetEnvIf Refererの設定。直リンク、iframe、img禁止。外部サイトからのファイル(ページ)の参照を禁止する。

更新:

.htaccess の SetEnvIf Referer で外部のサイトからのファイル(ページ)の参照を禁止する方法。

.htaccessで直リンク、iframe、imgなどの禁止

.htaccess でリファラ(参照元の情報)を取得して以下のようなことができる。

  1. 他人のサイトから自分のサイトへの直リンクを禁止する。
  2. 他所のサイトが frame、iframe タグなどを使用して自分のサイトのページを表示するのを禁止する。
  3. 他所のサイトが img タグなどを使用して自分のサイトの画像を表示するのを禁止する。

上記1のリンクを禁止したい人は少ないと思うが、特定のページへの直リンクを禁止したい場合があるかもしれない。
2、3に関しては禁止したいときがあり、「サーバに負荷がかかるから」など理由は人それぞれある。
.htaccess については .htaccessの設定 をご覧下さい。


特定のサイトからの参照を禁止する

外部のサイトからの直リンクや、iframe、imgタグによる参照を防ぐには、.htaccess に以下のように書く。
SetEnvIf Referer "http://www\.example\.com/" deny_ref
order allow,deny
allow from all
deny from env=deny_ref
これはリファラが "http://www.example.com/" と一致する場合は、そこからの参照を禁止する設定。
「.(ドット)」の前に「\(円、バックスラッシュ)」を入れているのは、""括弧内は正規表現が使えるため。
「.」は正規表現では改行以外の全ての文字を表す。
厳密に「.」を表したい場合は直前に「\」を入れる。
正規表現と一致したリファラを deny_ref と置いており、これは好きな文字列を指定して良い。
orderはallow,deny の順にし、allow from all ですべてのサイトのアクセスを許可する。
その後、deny from env=deny_ref で指定したリファラからのアクセスを禁止する。
サイトを複数指定したい場合はURLを列挙すれば良い。
SetEnvIf Referer "http://www\.example\.com/" deny_ref
SetEnvIf Referer "http://test\.com/" deny_ref
order allow,deny
allow from all
deny from env=deny_ref
ただ、アクセスを禁止(deny)するサイトの数が多すぎる場合は、自分のサイトや特定のサイトだけアクセスを許可(allow)しても良い(後述)。
JPEG、GIF、PNGなど画像のみ外部サイトからの参照を禁止したい場合は以下のように設定する。
<Files ~ "\.(gif|png|jpg)$">
SetEnvIf Referer "http://www\.example\.com/" deny_ref
order allow,deny
allow from all
deny from env=deny_ref
</Files>
これは拡張子(ファイルの末尾)が.gif、.png、.jpgの場合のみ <Files>から</Files>の間の設定が有効になる。
画像以外にもwmv、rm、mov、mpg、flvなどのファイルを指定しても良い。
ただ、画像や動画関連のファイルの参照を禁止する場合は、自分のサイトからのみ参照を許可する設定を行った方が良いかもしれない(後述)。


特定のサイトからのみ参照を許可する

アクセスを禁止するサイトの数が多いと記述するのが面倒なので、その場合自分のサイトや特定のサイトだけアクセスを許可すると良い。
特定のサイトからのみ直リンクや、iframe、imgタグによる参照を許可するには .htaccess に以下のように書く。
SetEnvIf Referer "http://www\.example\.com/" allow_ref
SetEnvIf Referer "^$" allow_ref
order deny,allow
deny from all
allow from env=allow_ref
これはリファラが "http://www.example.com/" と一致する場合のみ参照を許可する設定。
「^」は正規表現で文字列の先頭、「$」は文字列の末尾を示す。
"^$" は、リファラが空の場合に対応するために記載している。
orderは、deny,allow の順にし、deny from all ですべてのサイトのアクセスを禁止する。
その後、allow from env=allow_ref で指定したリファラからのアクセスを許可する。
画像など特定のファイルにのみ適用するには以下のように書く。
<Files ~ "\.(gif|png|jpg)$">
SetEnvIf Referer "http://www\.example\.com/" allow_ref
order deny,allow
deny from all
allow from env=allow_ref
</Files>


SSL(https)導入後、画像(GIF、JPEG、PNG)が表示されない

SSLを導入した場合、画像、CSS、JavaScriptなどの外部ファイルは https から記述するか、相対パスで指定しないとページに反映されない。
画像を自分のサイトだけで表示する上記の例は http と書いてあるので、https 導入後に画像が表示されないという罠がある。
画像にアクセスしても権限(permission)がないと言われる。
そこで例えば以下のように書く。
<Files ~ "\.(gif|png|jpg)$">
SetEnvIf Referer "https?://www\.example\.com/" allow_ref
order deny,allow
deny from all
allow from env=allow_ref
</Files>
https? は s の0回または1回の繰り返しを表し、つまり http と https 両方で有効となる。
このエントリーをはてなブックマークに追加