You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指定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校验逻辑,仅对指定路径跳过校验。

  1. 在项目任意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)
  1. 修改项目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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:09:38