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

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

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

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

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

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

Nginxで直リンクの制限するには

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

Module ngx_http_referer_module

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

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

たとえば、ある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」モジュールは、ホワイトリスト方式でアクセスを制限するため、有益なリンクを意図せず拒否してしまう可能性もあるので、設定後には意図した通りに動作しているか動作確認しましょう。