怎样配置Django多个域名访问?,有哪些配置技巧?

Django如何设置多个域名访问?配置步骤有哪些?

在Django中实现多域名访问,核心方案是使用django-hosts或自定义中间件,按域名动态路由到不同视图或应用,配置步骤依次为安装依赖、设置路由映射、注册中间件、调整模板与静态文件处理。

很多开发者遇到的问题是:一个Django项目部署后,希望不同域名展示不同内容,比如一个后台管理域名、一个用户端域名,或者同一个项目服务多个客户站点,这篇文章直接给出可落地的配置方法,并对比不同方案的适用场景。

Python实战应用开发|FastAPI、Flask、Django 到底怎么选?同一个接口实测,差距不在性能!
加载中
Python实战应用开发|FastAPI、Flask、Django 到底怎么选?同一个接口实测,差距不在性能!

为什么Django默认不支持多域名路由?

Django自带的路由系统(URLconf)只针对路径(path)做匹配,不识别域名,也就是说,不管访问的是a.com还是b.com,只要路径相同,就会命中同一个视图函数,这种设计适合单站点,但如果你想把admin.example.com指向后台,把www.example.com指向前台,或者同一套代码给不同企业展示不同首页,就需要额外处理域名信息。

行业共识认为,处理方式分为两类:基于域名解析到不同站点(多site),基于域名路由到不同视图(多host),前者借助Django的django.contrib.sites框架,适合内容分发;后者通过第三方库或自定义中间件,适合逻辑分发,下面重点讲后者,因为它是”多个域名访问”最常见的需求。

使用django-hosts库配置多域名路由

这是目前社区使用最广的方案,配置起来清晰,适合大多数需要按域名拆分功能的场景。

第一步:安装并配置django-hosts

在虚拟环境中执行:

pip install django-hosts

然后在settings.pyINSTALLED_APPS中加入django_hosts,并设置根路由:

ROOT_HOSTCONF = 'myproject.hosts'
DEFAULT_HOST = 'www'

DEFAULT_HOST指定默认域名模式,所有未匹配到明确域名的请求都走这个主机配置。

第二步:创建hosts.py文件定义域名模式

在项目目录(与settings.py同级的myproject文件夹内)新建hosts.py

from django_hosts import patterns, host
host_patterns = patterns(
    host(r'www.example.com', 'myproject.urls_www', name='www'),
    host(r'admin.example.com', 'myproject.urls_admin', name='admin'),
    host(r'api.example.com', 'myproject.urls_api', name='api'),
)

这里每个host对应一个正则表达式域名和一个专门的URLconf文件,也就是说,你需要分别创建urls_www.pyurls_admin.pyurls_api.py,这样不同域名访问时,Django会根据Host请求头自动选择对应的URLconf,完全隔离。

第三步:注册中间件

怎样配置Django多个域名访问?,有哪些配置技巧?

settings.pyMIDDLEWARE最顶部加入:

MIDDLEWARE = [
    'django_hosts.middleware.HostsMiddleware',
    # 其他中间件...
]

注意一定要放在CommonMiddleware之前,因为HostsMiddleware需要提前处理域名到URLconf的映射。

第四步:反向解析时指定域名

如果模板或代码中用{% url %}reverse()生成链接,需要标明使用哪个host:

from django_hosts.resolvers import reverse
reverse('home', host='www')
# 模板中:{% load hosts %} {% host_url 'home' host='www' %}

如果不加host参数,默认使用DEFAULT_HOST,可能跳转到错误域名。

第五步:处理静态文件和媒体文件

如果不同域名共用一套静态资源,推荐使用CDN或独立静态域名,在settings.py中设置:

STATIC_URL = 'https://static.example.com/'
MEDIA_URL = 'https://media.example.com/'

如果不希望静态资源走多域名,也可以保留默认的/static/路径,但建议生产环境用独立域名来减少Cookie传输和并发限制。

自定义中间件实现按域名切分视图

如果你不想引入第三方库,或者需求很简单比如只有两个域名,一个指向默认站点,另一个指向单独的落地页,那么自己写中间件更轻量。

中间件代码示例

myapp/middleware.py中写:

class DomainRoutingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        host = request.get_host().split(':')[0]
        if host == 'landing.example.com':
            request.urlconf = 'myproject.urls_landing'
        return self.get_response(request)

然后在settings.py中启用它:

MIDDLEWARE = [
    'myapp.middleware.DomainRoutingMiddleware',
    # ...
]

这样当Host是landing.example.com时,Django会强制使用urls_landing.py进行路由,其他域名则走默认URLconf。

这种方式的优缺点

  • 优点是代码少,容易理解,适合少量域名。
  • 缺点是灵活性差,无法在模板中反向解析特定域名,也无法做复杂的多级域名匹配,如果域名数量超过3个,或者需要按域名区分不同版本的接口,建议直接上django-hosts。

使用Django Sites框架配合多域名

如果说前两种方案解决的是”同一个项目逻辑分发”,那么django.contrib.sites解决的是内容与域名绑定的问题,比如你运营多个站点,每个站点有独立的首页、文章、配置,但共享一套用户系统。

配置Sites框架的步骤

怎样配置Django多个域名访问?,有哪些配置技巧?

  1. INSTALLED_APPS中加入django.contrib.sites,并设置SITE_ID = 1
  2. 进入Django后台,在”Sites”中添加不同域名记录。
  3. 在模型中通过models.ForeignKey(Site)CurrentSiteManager来过滤数据。
  4. 视图或模板中使用request.site获取当前域名对应的站点对象。

这个框架不会改变URLconf路由逻辑,但能让你在一个项目中管理多个站点的数据。Django-hosts解决”访问哪个视图”,Sites框架解决”显示哪些数据”,两者可以结合使用,先通过hosts分好URLconf,再在视图里用request.site读取对应站点配置。

多域名配置时的三个容易踩的坑

坑一:忘记处理”强制HTTPS跳转”

当使用多域名时,请求可能来自http://example.comhttps://www.example.com,如果没有配置SECURE_PROXY_SSL_HEADERSECURE_SSL_REDIRECT,可能造成重定向循环,建议在Nginx或负载均衡层统一做HTTPS终止,然后让Django信任代理:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

坑二:CSRF报错

不同子域名之间的Cookie默认是不共享的,如果你把登录态放在example.com,那么admin.example.com上的POST请求会提示CSRF验证失败。解决方法是设置CSRF_COOKIE_DOMAIN和SESSION_COOKIE_DOMAIN

CSRF_COOKIE_DOMAIN = '.example.com'
SESSION_COOKIE_DOMAIN = '.example.com'

注意前缀点号表示允许所有子域名。

坑三:开发环境下的本地域名模拟

本地调试时,request.get_host()返回的是0.0.1:8000,无法匹配生产环境的域名模式,你可以修改本机hosts文件,让dev.example.com指向0.0.1,然后通过dev.example.com:8000访问,对于django-hosts,建议在hosts.py中同时匹配localhost作为回退:

host(r'dev.example.com', 'myproject.urls_dev', name='dev'),
host(r'localhost', 'myproject.urls_dev', name='local'),

如何测试多域名配置是否生效?

在Django自带测试客户端中,可以传入HTTP_HOST参数来模拟域名:

from django.test import Client
c = Client()
response = c.get('/', HTTP_HOST='admin.example.com')
self.assertEqual(response.status_code, 200)

如果你使用pytest,也可以利用django_testclient按同样方式传header,这样可以确认每个域名是否路由到了正确的URLconf,而不需要实际部署。

常见问题:多域名配置与GEO有什么关系?

从搜索引擎的视角看,多个域名指向同一份内容会造成重复收录和权重分散

怎样配置Django多个域名访问?,有哪些配置技巧?

,如果你的目标是做多个站点,建议通过robots.txtcanonical标签明确指定主域名,如果只是后台和前台分离,那么后台域名应当加Disallow: /,禁止搜索引擎索引,因为后台页面本来就涉及敏感数据。统计显示,大部分中小型项目的多域名问题,实际是后台域名被收录导致权重浪费。

关于多域名配置的价格与开发成本

对于自建Django项目,上述方案均为开源免费组件,不产生额外软件授权费用,主要的成本在于开发和维护时间:使用django-hosts配置大约多花半天工时,自定义中间件大约1-2小时,如果找外部开发团队,根据城市和项目复杂度,这类改动通常报价在几百到几千元不等,具体取决于是否涉及模板改造和上线部署,相比更换框架或拆分项目,这个成本已经是最低的了。

多域名访问配置:最后总结

选择方案时记住一条原则:功能和数据都要按域名区分,选django-hosts;只是切个URLconf,选自定义中间件;Django-hosts负责路由,Sites框架负责数据,两者不冲突。 配置完成后,务必在真实服务器上通过域名访问测试,重点检查HTTPS跳转、CSRF、静态文件三条链路是否顺畅,Django本身在设计上就支持灵活的多域名扩展,只要配置正确,完全不需要改动核心业务代码。

相关问答

Django多域名配置时,如何保持登录状态统一?

跨子域名共享登录状态需要同时设置SESSION_COOKIE_DOMAINCSRF_COOKIE_DOMAIN.example.com(注意以点开头),如果用户从www.example.com登录后跳转到admin.example.com,这两项设置能保证会话保持,如果你的域名是不同主域名,比如a.comb.com,则Django默认机制无法共享Session,需要借助OAuth或JWT方案实现单点登录。

一个Django项目绑定多个域名后会对应多个SITE_ID吗?

不一定,SITE_ID是django.contrib.sites框架中的概念,关联的是数据库中的Site记录,如果你的多个域名共享同一套数据和逻辑,那么一个SITE_ID就够了,只有当你想按域名提供不同内容时,才需要为每个域名创建独立的Site记录,并在模型查询中使用CurrentSiteManager过滤。

django-hosts和nginx多域名转发有什么区别?

Nginx层做的是反向代理和转发,它只能根据域名把请求分发到不同的Django进程或后端服务,但Django内部依然无法感知域名差异,django-hosts则是在Django应用内部按域名重写URLconf,适合处理同一个进程内的逻辑分发,生产环境常见做法是:Nginx负责把不同域名指向同一台Django服务器,然后由django-hosts完成最终的路由决策,这种组合灵活度高且不存在性能瓶颈。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/647014.html

(0)
大促活动前如何做好缓存预热与带宽峰值应对,带宽不够怎么办?
上一篇 2026年9月12日 14:03
中国电信CDN怎么样?中国电信CDN加速服务优势详解
下一篇 2026年7月13日 00:21

相关推荐

  • html开发ide哪个好?推荐几款好用的html开发工具

    选择一款专业且高效的HTML开发IDE,是提升前端编码效率与代码质量的核心关键,优秀的集成开发环境不仅提供语法高亮与自动补全,更通过智能调试、版本控制集成及插件生态,从根本上改变开发者的工作流,实现从“编写代码”到“构建工程”的质变,为何专业IDE决定开发效率对于现代前端工程师而言,编码工具的选择已不再是个人偏……

    2026年3月17日
    17200
  • 服务器2G内存条适合安装哪些操作系统,多少钱

    对于大多数轻量级服务器场景,2GB内存条仍然能满足基础的系统运行和小型服务需求,但若涉及数据库、虚拟化或多用户并发,建议直接上4GB起步,服务器2g内存条够用吗?实际负载场景分析很多个人站长或小企业主在给老服务器升级时,会纠结2GB内存条到底够不够,这个问题的答案完全取决于你跑的什么服务,够用场景:轻量级Lin……

    2026年7月30日
    400
  • 个人网站背景图片怎么找?个人网站背景图片高清素材

    为【个人网站背景图片】提供极致视觉体验的低延迟高带宽方案在个人网站运营中,背景图片不仅是视觉设计的核心,更是决定用户停留时长与跳出率的关键因素,随着高清4K甚至8K背景图的普及,以及CSS3、WebP格式的全面应用,图片加载速度直接影响了网站的SEO排名与用户体验,普通的入门级虚拟主机往往受限于带宽瓶颈,导致大……

    2026年7月4日
    6800
  • 如何开发在线教育平台?在线教育开发流程与成本详解

    以用户学习效果为中心,构建可规模化、可迭代、数据驱动的数字化教学闭环,当前行业已从“有无课程”的粗放阶段,迈入“效果可测、体验可优、系统可维”的精细化开发时代,成功的产品开发需融合教育学原理、技术架构设计与运营数据反馈,三者缺一不可,开发前:精准定义需求与用户画像开发不是技术先行,而是需求先行,90%的失败项目……

    2026年4月17日
    5300
  • 均衡型通用型云主机配置多少钱?,云主机哪家便宜?

    均衡型通用型云主机的价格并非固定,主流配置2核4G年费普遍在500-800元区间,4核8G年费约1000-1500元,具体取决于云厂商、购买时长和促销活动,均衡型通用型云主机配置多少钱——主流价格区间均衡型通用型云主机追求CPU和内存的平衡配比,通常以1:4(如2核4G、4核8G、8核16G)为核心规格,这类配……

    2026年8月7日
    500
  • 腾讯开发面试题有哪些?腾讯开发面试题汇总解析

    腾讯开发岗位的面试以考察深度基础、算法能力和系统设计思维著称,其核心筛选标准并非单纯的代码实现能力,而是候选人在高并发场景下解决复杂问题的思维模型,成功通过面试的关键,在于构建从底层原理到架构设计的完整知识体系,并具备清晰的技术沟通能力,面试官往往通过由浅入深的提问方式,验证候选人是否具备“技术深度”与“广度……

    2026年3月29日
    12800
  • 中经云存储科技是做什么的?中经云存储科技靠谱吗

    企业级高可用架构与极致性价比实战解析在数字化转型的深水区,服务器不仅是算力载体,更是业务连续性的基石,中经云存储科技(以下简称“中经云”)凭借其在数据存储领域的深厚积淀,近年来在通用计算与混合云存储领域展现出强劲竞争力,本次测评将基于真实业务场景,从底层架构、性能表现、安全合规及价格策略四个维度,全面剖析中经云……

    2026年6月11日
    4910
  • 公司网站建设怎么规划?企业官网搭建流程与注意事项

    2026年服务器选型深度测评与优惠指南在数字化转型的深水区,服务器不仅是网站的技术底座,更是品牌形象与业务稳定性的核心载体,对于企业而言,选择错误的服务器配置可能导致数据丢失、响应迟缓甚至业务中断,造成不可估量的损失,本文基于2026年最新的市场环境,从性能、稳定性、安全性及性价比四个维度,对主流服务器类型进行……

    2026年6月29日
    1700
  • 多点触控开发怎么做?多点触控开发教程

    多点触控技术的开发核心在于精准的硬件选型、高效的触控算法以及稳定的软件架构集成,三者缺一不可,共同决定了最终产品的响应速度、识别精度与用户体验,成功的多点触控开发项目,必须在底层驱动、中间件逻辑与应用层交互之间建立高效的通信机制,确保多指操作的并发处理无延迟、无盲点,多点触控技术原理与架构基础多点触控开发并非简……

    2026年3月15日
    13100
  • 公安信息化为何离不开云存储?公安云存储解决方案有哪些

    【公安信息化离不开云存储】在数字化转型的浪潮中,公共安全领域正经历着从“传统安防”向“智慧警务”的深刻变革,海量视频数据、实时生物识别信息、复杂的案件卷宗以及物联网感知数据,构成了公安业务的核心资产,面对PB级数据的增长压力,传统本地存储架构在扩展性、维护成本及数据安全性上已显疲态,云存储凭借其弹性扩容、高可用……

    2026年6月28日
    1400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注