CentOS7のNginxでコンテンツへの直リンクを制御する方法

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

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

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

そこで、ここではCentOS7+NginxなWebサーバー環境で、Nignのモジュール(ngx_http_referer_module)を使って、画像などへの直リンクを制御する方法を紹介します。

動作環境

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

ソフトウェア バージョン
CentOS 7.6.1810
Nginx 1.15.9

ngx_http_referer_moduleとは

「ngx_http_referer_module」は、Nginxに標準で組み込まれているモジュールで、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」モジュールは、ホワイトリスト方式で制御を行うことから、有益なリンクを意図せず拒否してしまう可能性がありますのでご注意ください。

おすすめコンテンツ:
トップへ戻る