【Django】settings.py:ALLOWED_HOSTSとは(開発・本番環境)

時計 2021.11.10 / 時計

【Django】settings.py:ALLOWED_HOSTSとは(開発・本番環境)

本記事ではPythonのWebフレームワークであるDjangoにおける、settings.py内のALLOWED_HOSTSの意味とその役割について解説していきます。

Djangoでは設定ファイルsettings.pyに様々な設定を記述していきます。

その中でALLOWED_HOSTSはWebアプリケーションのセキュリティ部分を担っています。

ALLOWED_HOSTSは本番環境でDjangoを利用する場合、必ず必要になる知識です。本記事でALLOWED_HOSTSについて学んでいきましょう。

ALLOWED_HOSTS

ALLOWED_HOSTSとは

Django1.5からsettings.pyにALLOWED_HOSTSという設定項目が増えました。

settings.py内にあるALLOWED_HOSTSは、DjangoによるWebアプリケーションにおけるセキュリティの役割を担っています。

ALLOWED_HOSTSには、Webアプリケーションを配信するドメイン名やホスト名、IPアドレスをリストで指定します。

クライアントから送られたHTTPリクエスト内のホストヘッダー情報に、ALLOWED_HOSTSで指定したドメイン名などが含まれている場合にのみ、Webサービスがクライアントに提供されます。

これによりHTTPヘッダインジェクション(ホストヘッダー攻撃)を防ぐことができます。

IT用語の確認

ホストヘッダーとはHTTPリクエスト中に含まれる情報です。ホストヘッダーにはホスト(URI)とポートの情報を持ちます。

ALLOWED_HOSTSでホストヘッダーに指定できる値を制限しています。

まずはALLOWED_HOSTSにはWebサービスを提供するドメイン名をリストで指定すると覚えておいてください。

ALLOWED_HOSTSの指定する値

ALLOWED_HOSTSにはリストでドメイン名を指定します。デフォルト値は空のリストです。

リスト内に指定する値は文字列です。そのため先頭と末尾はシングルコーテーションで囲みます。

開発環境であれば、すべてのホストを許可する「'*'」(アスタリスク)やローカルホストを表す「'localhost'」、またはIPアドレス「'127.0.0.1'」などを指定します。

ALLOWED_HOSTS = ['localhost']

開発時は「*」を指定していいですが、本番環境では絶対に「*」を指定しないでしてください。

本番環境ではドメイン名を指定します。以下では本サイトoffice54.netを指定しています。

ALLOWED_HOSTS=['office54.net']

settings.pyのDEBUGがTrueかつALLOWED_HOSTSが空の場合、localhost、127.0.0.1、[::1]]が自動的に有効になります。

DEBUGをFalseに変更した途端エラーが発生するのは、上記の自動設定が無効になるからです。

settings.pyのDEBUGについては以下記事をご参照ください。

DisallowedHostエラー

開発環境でDisallowedHostエラーが表示した場合は、settings.py内のALLOWED_HOSTSにホスト名が指定されていない可能性が高いです。

デフォルトではALLOWED_HOSTSは空なので、必ずサーバーを稼働させる前にホスト名を指定するようにしましょう。

まとめ

本記事「【Django】settings.py:ALLOWED_HOSTSとは(開発・本番環境)」はいかがでしたか。

settings.pyには設定項目が非常に多いため、意味を理解せずにWebアプリケーションを開発している方が多いです。

しかし一つ一つの設定項目が重要な役割を持っているため、開発を効率的に進めるためにも、settings.pyの設定項目の理解を深めていきましょう。