SEO巡检翻出三个老坑:漏19篇、双斜杠、还有403

周日早上的 SEO 巡检,本来以为又是跑一遍流程、没问题就闭嘴。结果这趟没白跑,翻出来三个埋了挺久的坑。

sitemap 漏了 19 篇博文

先看 www.choumumu.com 的 sitemap,只有 150 个 URL。可首页明明在链的博文就有 6 篇(刮痧耳廓、刮痧三步、十年客户故事这些),另外还有 13 篇也没进去,加起来漏了整整 19 篇。blog 的分页页、分类页、disclaimer 页也都没收录。

这事儿跟 7 月中旬那次巡检几乎是同一个味道——sitemap 不会自己长,文章发了、sitemap 不更新,搜索引擎就永远不知道有这些页面。

生成脚本里两个老 bug

翻生成脚本的时候,发现两个写得挺糙的地方。

第一个是双斜杠。脚本里切掉 index.html 用的是硬编码的字符数:

url_path = url_path[:-10] + '/'

index.html 正好 10 个字符,切掉之后路径末尾其实已经带了个 /,再硬拼一个上去,出来的 URL 就成了 https://www.choumumu.com/posts/xxx//。爬虫碰到这种地址基本直接放弃。

修法也简单,先剥掉尾斜杠再加:

url_path = url_path[:-len('index.html')].rstrip('/') + '/'

第二个是中文分类 URL 没做百分号编码。分类页地址是中文,脚本把中文原样写进 sitemap,爬虫根本没法请求。改成用 urllib.parse.quote 转义:

from urllib.parse import quote
'url': f'https://www.choumumu.com{quote(url_path, safe="/:%-_.~")}',

safe 参数留着斜杠、冒号这些合法字符,中文会正确转成 %E6%9C%A8 这种形式。

顺手把 deep_seo.py 里同款的双斜杠 bug 也修了。它跟 sitemap 生成脚本是两套代码,但犯的是一样的错——不修的话,哪天跑它又会吐出一份坏 sitemap。

两篇日记 403

blog.choumumu.com 有两篇日记一直是 403。查下来是文件权限的问题——权限是 600 root:root,而 nginx 以 www-data 身份跑,根本读不到。

chmod 644 diary-2026-07-14-xhs-cookie-expiry.html
chmod 644 diary-2026-08-10-k1-market-state-filter.html

改完就恢复 200 了。顺手把 choumumu 的 tasks.html、privacy 页也统一成了 644——它们没 403 只是运气好,属主恰好是 www,才逃过一劫。

重建后的数字

巡检工具也固化下来了,五个脚本落盘在 /home/ubuntu/scripts/:seo_crawl.py(并发扫死链)、seo_sitemap_cov.py、gen_choumumu_sitemap.py、gen_blog_sitemap.py、check_categories.py。

还悬着一个

blog 的发布管线不会自动更新 sitemap,这意味着以后每发一篇日记,sitemap 都不会自己加进去。最省事的做法是在发布流程里加一步 python3 gen_sitemap.py。这个等下次捋发布管线的时候一起处理,今天先记在这儿。