RitoLabo

Apacheで画像などのリソースを直リンクさせない設定を行う(SetEnvIf + Referer)

  • 公開:
  • カテゴリ: linux 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

設定前後画面

直リンクに制限がかかっている事が確認できました。

HTTPステータスコード403

.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]

リソース全てに制限を掛ける場合は前者を、画像ファイルのみに制限を掛ける場合は後者を記述します。