Nginxで画像などのコンテンツへの直リンクを制限する方法

Nginxで画像などのコンテンツへの直リンクを制限する方法

Webサイトを運営していて頭を悩ませることの一つとして、サイト内に掲載されている画像などのコンテンツに直接リンクを張られてしまうこと(ファイルの外部参照)です。

Webサイトをより多くの人に知ってもらえるような使われ方なら、大いに歓迎したいところですが、中には直リンクした画像などを自サイトのコンテンツのように利用される場合があります。

アクセス数が少なければ、それほど気になることもないですが、直リンクによるアクセスにより、Webサイトに余計な負荷がかかりレスポンスが悪くなるような事態は避けたいところです。

そこでここでは、Nginxで構築Webサーバーで画像などへの直リンクを制限する方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
CentOS7.6.1810
Nginx1.15.9

直リンクを制限するには

Nginxで画像などのコンテンツへの直リンクを制限したい場合は、Nginxに標準で組み込まれているモジュール「ngx_http_referer_module」で、HTTPリクエストヘッダーのRefererフィールドの値によってアクセスを制限することができます。

Module ngx_http_referer_module

たとえば、自サイトや許可されたドメイン以外から画像ファイルなどへの直接アクセスを禁止することができます。

なお、「ngx_http_referer_module」モジュールは、ホワイトリスト方式で制御を行うため、アクセスを許可するドメインを指定する必要があります。

Refererフィールド値とは

たとえば、あるWebページに記載されているリンクをクリックして、別のWebページにアクセスした場合、Refererフィールドには、そのリンクが置かれているWebページのURLが格納されます。

ただし、リクエストによってはRefererフィールドが存在しない場合や、Refererフィールドを偽装することも可能なため、Refererフィールドによるアクセス制御は万能というわけではありません。

設定方法

Nginxへの設定方法は、serverディレクティブに以下のように記述します。

ここでは、自サイトの画像ファイルへのアクセスを、自サイトやTwitter・Google・Yahoo・Facebook・Bingからのみ許可し、それ以外の場合はHTTPレスポンスコード「403」を返して、アクセスを禁止しています。

location ~* \.(gif|jpe?g|png)$ {
    valid_referers none blocked server_names ~\.twitter\. ~\.google\. ~\.yahoo\. ~\.bing\. ~\.facebook\. ~\.fbcdn\.;
    if ($invalid_referer) {
       return 403;
    }
}

正規表現によるロケーションの指定では、設定ファイルで最初に一致したものだけが適用されるので、設定がうまく適用されないときは、既存の記述に同じロケーションの指定がないか確認してみてください。

あとがき

「ngx_http_referer_module」モジュールは、ホワイトリスト方式でアクセスを制限するので、有益なリンクを意図せず拒否してしまう可能性があるのでご注意ください。