如何配置Django的ALLOWED_HOSTS以支持可变前缀的三级子域名?
配置Django支持三级子域名的ALLOWED_HOSTS
情况1:允许所有后缀为domain.com的子域名(包括二级、三级及以上)
其实你之前用的ALLOWED_HOSTS=['.domain.com']已经能满足需求——Django中,以点开头的域名会匹配所有层级的子域名,不管前面有多少个前缀。也就是说,这个配置不仅支持a.domain.com这类二级子域名,也自动支持a.appointment.domain.com、b.test.domain.com这类三级子域名,甚至更深层级的域名也能匹配。
情况2:仅允许三级子域名(限制为x.x.domain.com格式,不允许二级或四级)
如果你的需求是只允许三级子域名,不希望二级子域名(如a.domain.com)或四级子域名(如x.x.x.domain.com)通过验证,可以使用正则表达式配置ALLOWED_HOSTS(Django 1.10及以上版本支持):
ALLOWED_HOSTS = [ r'^[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+\.domain\.com$' ]
正则说明:
[a-zA-Z0-9-]+:匹配第一个可变前缀(支持字母、数字、连字符,长度至少1位),对应例子中的a、b- 第二个
[a-zA-Z0-9-]+:匹配第二个可变前缀,对应例子中的appointment、test \.domain\.com:匹配固定后缀,注意正则中点需要用\转义,避免匹配任意字符^和$:确保整个域名完全匹配,避免出现部分匹配的情况
验证方法
可以通过运行Django项目后用不同域名访问测试,或者在Django shell中使用内置函数验证:
from django.http.request import validate_host # 测试三级子域名 print(validate_host('a.appointment.domain.com', ALLOWED_HOSTS)) # 应返回True # 测试二级子域名(情况2下应返回False) print(validate_host('a.domain.com', ALLOWED_HOSTS))
内容的提问来源于stack exchange,提问作者Akram
相关产品推荐
相关产品推荐

