Apacheで画像などのリソースを直リンクさせない設定を行う(SetEnvIf + Referer)
- 公開日
- カテゴリ:Apache
- タグ:Apache,httpd,2.4

ネットサーフィンをしていると、色々な WEB サービスやブログなどで「直リンク禁止」といった表示を見かけます。
直リンクとは、外部のサイトなどで、自サーバのリソース(画像など)に対して直接リンクを張り表示させる事です。つまりは、「他者のリソースをそのまま使う」という事になります。具体的には、以下のような状態です。
dev-laravel.com というサイトで、dev-php.com の画像が使われています。この状態が直リンクになります。
直リンクが行われるという事は、そのリソースのリクエストが自分のサーバへ送られるので、その分サーバのリソースを消費します。つまりは、負荷になります。
直リンクに制限を掛ける場合は、Apache の設定から行えます。例えば、png 画像を他者から直リンクさせないようにするには、以下のように設定します。
- httpd.conf
-
# vim /path/to/httpd.conf SetEnvIf Referer dev-php\.com allow_dmain <Files *.png> order deny,allow Deny from all Allow from env=allow_dmain </Files>
まずは SetEnvIf ディレクティブですが、
SetEnvIf + Referer + ドメイン + 任意の環境変数名
の形で、許可するドメインをセットします。
次に、Files コンテナ指示子で png 画像についての許容範囲を定義します。
- order deny,allow(デフォルトは許可)
- Deny from all(Deny で全て拒否する)
- Allow from env=allow_dmain(allow_dmain=1 のものは許可)
書式チェックを行い、httpd を再起動します。
# 設定ファイルの書式チェック
[root@localhost ~]# httpd -t
Syntax OK
# httpd 再起動
[root@localhost ~]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service
これで設定したドメインからのリクエスト以外は png 画像のレスポンスが返されなくなります。尚、直リンクなど外部からリクエストを投げると、403 が返されます。
ちなみに、複数の画像拡張子に対応させ制限を掛ける場合は以下のように設定します。
# vim /path/to/httpd.conf
SetEnvIf Referer dev-php\.com allow_dmain
<FilesMatch ^.+\.(png|gif|jpg|jpeg)$>
order deny,allow
Deny from all
Allow from env=allow_dmain
</FilesMatch>
書式チェックを行い、httpd を再起動します。
# 設定ファイルの書式チェック
[root@localhost ~]# httpd -t
Syntax OK
# httpd 再起動
[root@localhost ~]# service httpd restart
Redirecting to /bin/systemctl restart httpd.service
直リンクに制限がかかっている事が確認できました。
.htaccess からの制限
httpd.conf を触れない状況下でも、.htaccess を作成する事で直リンクの制限を行う事も出来ます。制限を掛けたいリソースのあるディレクトリに.htaccess を作成し、以下を記述します。
# 全体に制限をかける
SetEnvIf Referer "dev-php.com" allow_dmain
order deny,allow
Deny from all
Allow from env=allow_dmain
# 画像ファイルのみに制限をかける
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://dev-php.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
リソース全てに制限を掛ける場合は前者を、画像ファイルのみに制限を掛ける場合は後者を記述します。