带版本管理的 robots.txt¶
一个站点只有一份 robots.txt,但它的内容会随时间变化,而一次错误的改动(比如多了一行 Disallow: /)可能悄无声息地毁掉搜索流量。
django-seo-suite 从数据库提供 robots.txt,并把 每一个版本 都保留为快照。流量下跌时,你可以把时间线和统计数据对照起来,判断是不是某次 robots.txt 改动造成的。
核心思路:
- 每次编辑都会生成新版本(一条新记录),历史从不覆盖。
- 每个站点只有一个激活版本,也就是实际对外提供的那个。
- 切换线上版本要通过后台的 “激活”操作,而不是手动改激活标志,因此不会意外出现两个(或零个)激活版本。
- 每个版本都会记录 创建人和创建时间,以及 激活时间。
安装配置¶
模型位于核心的 seo_suite 应用中,安装并迁移后即可使用:
把路由加到根 URLconf:
# urls.py
from django.urls import include, path
urlpatterns = [
# ...
path("", include("seo_suite.urls")), # serves /robots.txt
]
现在 GET /robots.txt 会以 text/plain 返回当前激活的版本。
在后台管理版本¶
在 Django 后台打开 SEO Suite → robots.txt versions。
要修改 robots.txt,请 添加一个版本:表单会预填当前线上内容,在此基础上编辑,可选填一个 标签(例如“屏蔽 /staging”)和一条说明 原因 的 备注,然后点击 保存。保存后它立即成为线上 robots.txt,原来的线上版本则变成一条历史记录,不会被覆盖。
历史版本是只读的:你无法原地修改某个快照的内容。线上 robots.txt 只能通过添加新版本来改变,这样历史记录才可信。
列表页显示 version、label、site、is_active、created_at、activated_at 和 created_by,构成完整的审计记录。
回滚
改错了?在列表页勾选一个较早的版本,执行 “回滚到所选版本” 操作,该版本就会重新发布为线上 robots.txt。什么都没有丢,所有版本仍然都在。
回退内容¶
当(当前站点)没有任何激活版本时,视图会返回 SEO_SUITE["ROBOTS_TXT_FALLBACK"]:
把爬虫指向站点地图¶
无需修改内容,即可在每次返回的 robots.txt 末尾追加 Sitemap: 行:
SEO_SUITE = {
"ROBOTS_SITEMAP_URLS": [
"https://example.com/sitemap.xml",
"/news-sitemap.xml", # relative URLs are made absolute against the request
],
}
输出:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/news-sitemap.xml
多站点¶
如果你运营多个站点,可以给版本设置 站点,把它限定到该站点;留空则表示该版本适用于 所有站点。解析时优先使用站点专属的激活版本,没有则回退到全局版本。站点解析遵循本包其他部分相同的链路:安装了 django.contrib.sites 就用它,否则用 settings.SITE_ID,再否则视为单站点。
缓存¶
robots.txt 访问量很低,所以默认不缓存。如需开启:
返回内容按站点缓存,并在任一版本保存或激活时自动失效,因此激活新版本会立即生效。
设置一览¶
| 设置 | 默认值 | 用途 |
|---|---|---|
ROBOTS_TXT_FALLBACK |
"User-agent: *\nAllow: /" |
没有激活版本时返回的内容 |
ROBOTS_SITEMAP_URLS |
[] |
以 Sitemap: 行追加的 URL |
ROBOTS_CACHE_TTL |
0 |
缓存返回内容(0 表示关闭) |