有没有办法在django中设置ALLOWED_HOSTS IP的范围?
像这样的东西:
ALLOWED_HOSTS = ['172.17.*.*']
我在Django上发了一张票但是我看到这可以通过以下方式实现
from socket import gethostname, gethostbyname
ALLOWED_HOSTS = [ gethostname(), gethostbyname(gethostname()), ]
不,这目前不可行。根据the docs,支持以下语法:
['www.example.com'] # Fully qualified domain
['.example.com'] # Subdomain wildcard, matches example.com and www.example.com
['*'] # Matches anything
如果查看validate_host
方法的实现,可以看到不支持使用*
作为通配符。
这是一个快速而肮脏的解决方案。
ALLOWED_HOSTS += ['172.17.{}.{}'.format(i,j) for i in range(256) for j in range(256)]
Mozilla发布了一个名为django-allow-cidr的Python软件包,旨在解决这个问题。
announcement blog post解释说,它对于没有Host
标头且只使用IP地址的健康检查这样的东西很有用。
你必须稍微改变你的IP地址'172.17.*.*'
像CIDR range这样的172.17.0.0/16
我找到了过滤IP范围的解决方案:
https://stackoverflow.com/a/36222755/3766751
使用这种方法,我们可以通过任何方式过滤IP(例如,使用正则表达式)。
from django.http import HttpResponseForbidden
class FilterHostMiddleware(object):
def process_request(self, request):
allowed_hosts = ['127.0.0.1', 'localhost'] # specify complete host names here
host = request.META.get('HTTP_HOST')
if host[len(host)-10:] == 'dyndns.org': # if the host ends with dyndns.org then add to the allowed hosts
allowed_hosts.append(host)
elif host[:7] == '192.168': # if the host starts with 192.168 then add to the allowed hosts
allowed_hosts.append(host)
if host not in allowed_hosts:
raise HttpResponseForbidden
return None
感谢@Zorgmorduk