如何在指定Django REST API接口上禁用ALLOWED_HOST校验?
针对特定API URL禁用Django ALLOWED_HOST校验的实现方案
Django原生的ALLOWED_HOSTS校验逻辑由内置的CommonMiddleware实现,默认对所有请求生效,没有提供按路径豁免的官方配置,可通过以下两种方案实现需求:
方案1:反向代理层处理(推荐,无代码侵入、安全风险低)
如果你的服务前部署了Nginx等反向代理,直接在代理层为特定路径的请求强制设置合法的Host头即可,Django层不需要做任何修改,原生校验规则完全保留。
配置示例(Nginx):
# 匹配RFID设备上报的API路径 location /api/rfid/data-upload/ { # 强制设置为ALLOWED_HOSTS列表内的合法域名 proxy_set_header Host your-official-domain.com; # 其余代理配置和普通接口保持一致 proxy_pass http://django_upstream; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
注意:如果RFID设备有固定公网IP,建议额外加一层IP白名单限制,仅允许该设备IP访问这个接口,进一步降低安全风险。
方案2:自定义中间件实现路径豁免
如果不方便修改反向代理配置,可以自定义中间件重写Host校验逻辑,仅对指定路径跳过校验。
- 在项目任意app目录下新建
middleware.py文件,写入以下代码:
from django.middleware.common import CommonMiddleware class HostValidateExemptMiddleware(CommonMiddleware): # 配置需要跳过Host校验的路径,替换为你的实际API地址 EXEMPT_PATH_LIST = [ "/api/rfid/data-upload/", ] def process_request(self, request): # 命中豁免路径直接放行,不做Host校验 if request.path in self.EXEMPT_PATH_LIST: return None # 其余路径走原生ALLOWED_HOSTS校验逻辑 return super().process_request(request)
- 修改项目
settings.py的MIDDLEWARE配置,替换默认的CommonMiddleware:
MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", # 注释掉原生的CommonMiddleware # "django.middleware.common.CommonMiddleware", # 替换为自定义的中间件,注意替换为你实际的导入路径 "your_app_name.middleware.HostValidateExemptMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", # 其余中间件保持原有顺序不变 # ... ]
安全提示
被豁免Host校验的接口必须单独做鉴权校验,比如要求RFID设备请求时携带固定的API Key、签名,避免接口被未授权访问。
内容的提问来源于stack exchange,提问作者pawan kumar
相关产品推荐
相关产品推荐

