同一Django站点多域名场景下Sitemap正确生成问题咨询
问题解决方法
出现该问题的核心原因是Django自带的sitemap功能默认读取django.contrib.sites框架配置的固定主域名生成链接,不会自动适配当前请求的访问域名,你可以根据项目需求选择以下两种方案修改:
方案1:关闭sites框架(最简单,适合同一站多域名访问场景)
如果你的项目没有其他功能依赖sites框架,直接关闭即可让sitemap自动适配当前请求域名:
- 打开项目
settings.py,在INSTALLED_APPS列表中删除/注释django.contrib.sites项 - 删除
settings.py中的SITE_ID配置项 - 重启Django服务生效
注意:如果项目其他功能依赖sites框架,不要使用该方案,改用方案2
方案2:自定义Sitemap类,动态适配请求域名
如果需要保留sites框架,你可以重写Sitemap的域名获取逻辑:
- 新建/打开项目的
sitemaps.py文件,定义动态域名Sitemap基类:
from django.contrib.sitemaps import Sitemap as BaseSitemap from django.contrib.sites.shortcuts import get_current_site class DynamicDomainSitemap(BaseSitemap): def get_urls(self, page=1, site=None, protocol=None): # 优先读取当前请求的域名,而非配置的固定站点域名 if site is None and hasattr(self, 'request'): site = get_current_site(self.request) return super().get_urls(page=page, site=site, protocol=protocol)
- 你自己定义的所有Sitemap子类全部改为继承
DynamicDomainSitemap,而非默认的BaseSitemap - 检查所有模型的
get_absolute_url方法,不要硬写固定域名,保持相对路径即可 - 重启Django服务生效
验证
配置完成后分别访问三个域名的sitemap地址:
https://www.example.com/sitemap.xmlhttps://www.example.xyz/sitemap.xmlhttps://www.example.one/sitemap.xml
确认每个sitemap内的链接前缀和当前访问域名匹配即可。
内容的提问来源于stack exchange,提问作者oneclick
相关产品推荐
相关产品推荐

