怎样配置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.py的INSTALLED_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.py、urls_admin.py、urls_api.py,这样不同域名访问时,Django会根据Host请求头自动选择对应的URLconf,完全隔离。

第三步:注册中间件

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

在settings.py的MIDDLEWARE中最顶部加入:

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.com和https://www.example.com,如果没有配置SECURE_PROXY_SSL_HEADER或SECURE_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_test的client按同样方式传header,这样可以确认每个域名是否路由到了正确的URLconf,而不需要实际部署。

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

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

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

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

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

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

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

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

相关问答

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

跨子域名共享登录状态需要同时设置SESSION_COOKIE_DOMAIN和CSRF_COOKIE_DOMAIN为.example.com(注意以点开头),如果用户从www.example.com登录后跳转到admin.example.com,这两项设置能保证会话保持,如果你的域名是不同主域名,比如a.com和b.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
catalysthost VPS好用吗,西雅图机房速度快吗
下一篇 2026年9月12日 14:06

相关推荐

  • 配置vs开发环境步骤有哪些,VS开发环境搭建教程

    高效配置Visual Studio开发环境的核心在于精准匹配项目需求与组件依赖,通过模块化安装与智能化调试设置,构建稳定、流畅且可扩展的编码工作流,一个优秀的开发环境不仅是代码编辑的工具,更是保障代码质量、提升开发效率的基石,对于开发者而言,掌握环境配置的逻辑比单纯的操作步骤更为关键,这直接决定了后续开发过程的……

    2026年3月27日
    10800
  • 虚拟机2017官网下载安全吗,虚拟机哪个版本最好用?

    虚拟机2017版本基本指2017年发布的VMware Workstation Pro 14或VirtualBox 5.2,官网现在很少把2017旧版直接放在首页下载入口,安全与否取决于是否走官网下载并做哈希校验,支持系统以Windows 7/8/10和主流Linux发行版为主,虚拟机2017下载官网到底在哪很多……

    2026年9月11日
    300
  • 云通信市场如何共赢?万亿级云通信市场趋势

    2026年高性能云服务器深度测评与选型指南随着5G普及、物联网爆发以及企业数字化转型的深入,云通信市场正迎来前所未有的增长机遇,据行业预测,到2026年,全球云通信市场规模将突破万亿大关,在这一背景下,稳定、低延迟、高并发的服务器基础设施成为了决定企业竞争力的核心要素,对于IM即时通讯、视频通话、语音直播等对实……

    2026年6月17日
    3200
  • php开发工具mac版哪个好?mac上最好用的php开发工具推荐

    在Mac环境下进行PHP开发,最高效的方案并非寻找单一的“全能软件”,而是构建一套以高性能编辑器为核心、集成专业调试环境与依赖管理工具的组合工作流,核心结论是:选择VS Code作为主力编辑器,配合Homebrew管理环境,使用Docker容器化部署,辅以Sequel Ace处理数据库,这套组合不仅免费开源,而……

    2026年3月12日
    12500
  • 嵌入式开发与游戏开发哪个好?就业前景与薪资待遇对比

    嵌入式开发与游戏开发虽然应用领域迥异,但在底层逻辑、架构设计及性能优化层面拥有高度的一致性,核心结论是:嵌入式开发侧重于软硬件资源的极致约束与实时性控制,游戏开发则聚焦于图形渲染管线与交互体验的流畅度,两者在驱动开发、内存管理及并发处理上存在技术同构性,掌握其中一方的核心思维能显著降低另一方的学习门槛,技术架构……

    2026年3月28日
    10200
  • 原型法开发方法是什么意思,原型法开发有哪些步骤?

    原型法开发方法是现代软件工程中应对需求不确定性的核心策略,其本质在于通过快速构建可交互的模型来验证假设、明确需求,从而大幅降低项目返工风险并提升交付质量,这种方法打破了传统线性开发的局限,强调在编码前通过可视化的手段与用户达成共识,是连接抽象业务逻辑与具体技术实现的桥梁,对于追求敏捷交付和用户体验的团队而言,掌……

    2026年2月26日
    17400
  • 德国和美国哪个更发达?为何德国美国实力差距这么大

    在全球数字化业务部署中,服务器地理位置的选择直接决定了目标用户的访问体验与业务合规性,德国与美国作为全球两大核心数据中心枢纽,分别代表了欧洲与北美最高水平的网络基础设施,本文将从物理网络、硬件性能、合规性及成本等维度,对德国与美国服务器进行深度横向测评,并同步释放2026年度专属促销活动,核心网络架构与路由分析……

    2026年4月27日
    6300
  • 香港免备案域名真的不用备案吗,香港免备案域名哪里注册好

    只要解析到香港或境外服务器,注册后几分钟到几十分钟就能上线,不用提交身份证和等待管局审核,适合外贸站、技术测试、个人项目等对时效要求高的场景,香港免备案域名和国内备案域名的区别是什么?国内备案域名的核心是ICP备案,这是内地服务器接入的制度要求,域名本身没有“备案”属性,使用环境决定是否需要备案,香港免备案域名……

    2026年9月12日
    200
  • 服务器为什么要多cpu,服务器双cpu和单cpu哪个好?

    多cpu服务器通过搭载两颗或更多物理CPU,能够显著提升并行计算能力,尤其适合虚拟化整合、数据库高并发和科学计算场景,但它的成本、功耗和主板兼容性也是选型时必须权衡的关键因素,多cpu服务器和单cpu区别到底在哪多cpu与单cpu服务器的根本差异在于并行处理的上限和资源拓扑,单cpu系统受限于单颗芯片的物理核心……

    2026年7月26日
    1300
  • 定向增发与非公开发行有什么区别?定向增发是利好还是利空

    定向增发与非公开发行在本质上属于同一资本运作概念,其核心区别仅在于称呼习惯与监管语境的差异,二者均是指上市公司向特定对象发行股票募集资金的行为,具有发行门槛低、融资效率高、发行价格折扣优惠等显著特征,是上市公司优化资本结构、引入战略投资者或并购重组的重要金融工具, 核心定义与法律性质辨析在资本市场实务中,准确理……

    2026年3月24日
    15100

发表回复

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