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

如何在Django中仅允许127.0.1:8000用HTTP,其余域名保持HTTPS?

区分本地测试与生产环境的HTTPS配置方案

针对你想让127.0.1.1:8000用HTTP、*.example.com保持HTTPS的需求,有两种可行方案,同时这种做法不属于不良实践,是合理的环境区分策略。

方案一:用中间件动态控制请求处理

因为Django的全局配置默认对所有请求生效,我们可以通过自定义中间件,针对本地测试地址跳过HTTPS重定向并调整Cookie属性:

  1. 在你的应用目录下创建middleware.py文件,写入以下代码:
from django.conf import settings
from django.http import HttpResponsePermanentRedirect

class LocalHttpAllowMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 定义允许HTTP访问的本地地址列表
        local_allowed_hosts = ['127.0.1.1:8000', 'localhost:8000']
        current_host = request.get_host()
        
        if current_host in local_allowed_hosts and not request.is_secure():
            # 本地HTTP请求直接处理,跳过HTTPS重定向
            response = self.get_response(request)
            # 取消Cookie的secure属性,避免本地HTTP下Cookie无法正常使用
            for cookie_name in ['sessionid', 'csrftoken']:
                if cookie_name in response.cookies:
                    response.cookies[cookie_name]['secure'] = False
            return response
        
        # 非本地请求沿用原有HTTPS配置
        return self.get_response(request)
  1. 在settings.py的MIDDLEWARE列表中添加这个中间件,注意要放在SecurityMiddleware之后:
MIDDLEWARE = [
    # ... 其他中间件 ...
    'django.middleware.security.SecurityMiddleware',
    'your_app_name.middleware.LocalHttpAllowMiddleware',  # 替换为你的应用名
    # ... 其他中间件 ...
]
  1. 保留原有的HTTPS配置不变:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

方案二:用环境变量切换配置

通过环境变量区分开发和生产环境,加载对应的配置,逻辑更清晰:

在settings.py中修改配置:

import os

# 通用配置
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# 根据环境变量判断环境类型
if os.environ.get('DJANGO_ENV') == 'dev':
    # 本地开发环境:禁用HTTPS强制
    SECURE_SSL_REDIRECT = False
    SESSION_COOKIE_SECURE = False
    CSRF_COOKIE_SECURE = False
else:
    # 生产环境:启用HTTPS强制
    SECURE_SSL_REDIRECT = True
    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True

启动本地服务时设置环境变量:

# Linux/macOS终端
export DJANGO_ENV=dev && python manage.py runserver 127.0.1.1:8000

# Windows命令提示符
set DJANGO_ENV=dev && python manage.py runserver 127.0.1.1:8000

生产环境启动时不设置DJANGO_ENV,自动启用HTTPS配置。

是否属于不良实践?

这种做法完全合理,不属于不良实践:

  • 本地开发用HTTP能简化测试,无需配置本地SSL证书,提升开发效率;
  • 生产环境强制HTTPS是必要的安全措施,可防止数据传输被窃听、篡改,符合Web安全规范;
  • 只要确保开发环境的配置逻辑不会在生产环境生效,就不存在安全风险。

注意事项:

  • 用中间件方案时,要确保本地地址列表准确,避免误豁免生产环境请求;
  • 生产环境必须严格启用HTTPS相关配置,不能依赖本地的豁免逻辑。

内容的提问来源于stack exchange,提问作者Kaelan O'reily

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:52:40