HttpRequest.get_host()
との違いHttpRequest.META['REMOTE_ADDR']
は、最初の 1 つが優先度の高い順に次のヘッダーで IP をチェックすることです。
HTTP_X_FORWARDED_HOST
HTTP_HOST
SERVER_NAME combined with SERVER_PORT
一方、2 つ目はヘッダーの IP をチェックしますREMOTE_ADDR
。
返される情報のタイプには大きな違いがありget_host()
ます。クライアントの IP ではなく、アプリケーションをホストしているサーバーの名前が返されます。
より詳細には、次の実装がありget_host()
ます。
def get_host(self):
"""Returns the HTTP host using the environment or request headers."""
# We try three options, in order of decreasing preference.
if settings.USE_X_FORWARDED_HOST and (
'HTTP_X_FORWARDED_HOST' in self.META):
host = self.META['HTTP_X_FORWARDED_HOST']
elif 'HTTP_HOST' in self.META:
host = self.META['HTTP_HOST']
else:
# Reconstruct the host using the algorithm from PEP 333.
host = self.META['SERVER_NAME']
server_port = str(self.META['SERVER_PORT'])
if server_port != ('443' if self.is_secure() else '80'):
host = '%s:%s' % (host, server_port)
allowed_hosts = ['*'] if settings.DEBUG else settings.ALLOWED_HOSTS
domain, port = split_domain_port(host)
if domain and validate_host(domain, allowed_hosts):
return host
else:
msg = "Invalid HTTP_HOST header: %r." % host
if domain:
msg += "You may need to add %r to ALLOWED_HOSTS." % domain
raise DisallowedHost(msg)
クライアント IP アドレスを確認したい場合は、確認する価値のあるヘッダーをいくつか示します (クライアント IP アドレスの取得: REMOTE_ADDR、HTTP_X_FORWARDED_FOR、他に役立つものはありますか? を参照)。
REMOTE_ADDR
HTTP_X_FORWARDED_FOR
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
IP のカンマ区切りのリストにすることができます
HTTP_X_FORWARDED
HTTP_X_CLUSTER_CLIENT_IP
HTTP_FORWARDED_FOR
HTTP_FORWARDED
どれを選択すればよいかわからない場合 (すべてではないにしても)、それらのヘッダーをログに記録し、時間をかけて新しいチェックを実用的に追加できます。