
每次有人神神秘秘地凑过来问:“你们 CMS 的文章链接,要不要加个 .html 后缀?不加对 SEO 不好吧?”我就知道,又要开始我的“伪静态”表演了。
先声明:下面这些话,一半是经验,一半是江湖传言的祛魅。看完你大概率会得到一个反直觉的结论——加不加 .html,搜索引擎根本不在乎;但你的客户在乎,所以好的 CMS 应该把这个开关交还给用户。
一、先把 VVCMS 自己怎么做的说清楚

VVCMS 后台有个“配置 → 内容重写”页面,本质就是给文章链接做定制。它只有两个开关:
- 生成 .html 后缀(
has_html_sufix):开或关; - 匹配前缀(
match):比如填post,文章就变成/post/别名.html。
默认形态是 /栏目/别名,开了之后可以变成 /post/别名.html。看起来是个小功能,但里面藏着两个很“较真”的工程判断:
- 全站只保留一套 URL。一旦开启
.html,不带.html的请求不是 301 跳转,而是直接 404(源码front_usecase.go里:if routeRule.HasHTML && !strings.HasSuffix(uri, ".html")直接渲染 404)。原因很简单:如果/a/b和/a/b.html都能打开同一篇内容,搜索引擎会认为是两份重复内容,权重被稀释、抓取配额被浪费。所以 VVCMS 选了“要么有后缀、要么没有,绝不给两套同时活着”。 - 只作用于“内容”,不动栏目 / 分类。这个引擎只给文章详情页加前缀和
.html,栏目列表、分类、单页都不参与。下面第六节能解释为什么。
二、.html 后缀对 SEO 到底有没有用
把各大搜索引擎的官方说法摊开看:
- Google:官方多次明确,URL 的扩展名不是排名因素。John Mueller 在 Webmaster Hangout 和社交平台上反复说过,
.html和没有扩展名,Google 一视同仁。Google 关心的是内容质量、外链、页面体验和稳定性,不关心你是不是.html。 - Bing / 微软:同样,扩展名与排名无关。
- 百度:这是国内讨论最激烈的地方。中文 SEO 圈普遍迷信
.html。百度官方站长平台早年的建议是“尽量静态化 / 伪静态化 URL”,背景是十几年前百度对带参数的动态地址(?id=1)抓取不友好。但这句话的本意是“去掉杂乱参数、变短、变整洁”,不是“必须带 .html”。如今百度对动态 URL 的抓取早已没有硬伤。
一句话结论:从纯算法角度,.html 不加分。真正加分的是——URL 稳定、简短、有语义、且唯一(canonical)。而这几点,带不带 .html 都能做到。
三、那为什么还有人非要 .html
这是需求侧的问题,不是技术侧:
- 历史路径依赖。“
.html= 静态页 = 快 = 被爬虫喜欢”是十几年前的行业共识。它本质是谬误,但形成了强大的惯性。 - 客户和老板的执念。很多建站公司、企业客户点名要“
.html伪静态,对 SEO 好”。这是 KPI 式需求,你跟他说算法不在乎,他听不进去。 - 国内 CMS 的默认倾向。织梦(DedeCMS)、帝国(EmpireCMS)、PHPCMS、Z-Blog 默认或常见配置都是
.html伪静态。WordPress 默认是干净链接,但国内一票插件专门给 WordPress 硬加.html。 - 国外的态度相反。Ghost、Hexo、Hugo、Next.js 默认就是干净 URL;WordPress 英文站几乎没人加
.html。
四、各语言 / 框架对 .html 的态度
| 语言 / 框架 | 典型态度 | 说明 |
|---|---|---|
| PHP | 默认爱带 | 国内 CMS 几乎全是 PHP,.html 伪静态是标配,靠 Apache .htaccess / Nginx rewrite 实现。 |
| Java | 基本不带 | Spring 系习惯干净 REST 风格,早年用过 .do、.action(Struts),现在多是无扩展名;Thymeleaf 也是干净路径。 |
| .NET | 想藏掉 | ASP.NET 早期是 .aspx,但开发者恰恰想“隐藏”扩展名,路由化后默认干净 URL。 |
| Python | 默认不带 | Django / Flask 路由天然没有扩展名。 |
| Node / 前端 | 默认不带 | Next.js 文件路由、Nuxt,干净 URL 是默认;.html 反而显老。 |
| Go(VVCMS 自身) | 可加可不加 | net/http、gin 路由自由,想加就加、想不加就不加。VVCMS 选择“默认不加、可选项加”,本身就是 Go 生态务实态度的体现。 |
规律很清晰:越现代、越偏前端的框架,越不爱 .html;越传统的服务端渲染(尤其中文 PHP 系),越爱 .html。
五、VVCMS 的妥协方案:把选择权交给用户
“伪静态”的真正水平,不是替用户拍板,而是既懂它不重要,又给用户一个体面的选项。VVCMS 的做法是:
- 不强制,也不禁止。后台一个开关 + 一个前缀输入框,用户自己决定要不要
.html、要不要/news/这种前缀。 - 用工程手段堵住最常见的坑。上面说的“只保留一套 canonical URL”,开了后缀就 404 不带后缀的,避免重复内容(duplicate content)分散权重。
- 伪静态不是真静态。VVCMS 仍是 Go 模板动态渲染,
.html只是 URL 外观,不生成物理文件。好处是随时可改、不占磁盘、更新即时生效。
六、为什么只给“内容”加,不给“栏目 / 分类”加
这是整个设计里最容易被追问、也最值得解释的一点:
- 栏目 / 分类是站点骨架。数量少、层级固定。给它们加
.html收益极低(SEO 不加分),却要改路由解析、模板映射(注意category.html同时还是模板视图名,容易和“栏目别名.html”混淆)、面包屑和分页链接,复杂度陡增。 - 内容才是长尾主体。文章详情页成千上万条,用户要
.html、要自定义前缀(如/news/、/blog/),几乎都是冲着“文章详情页”来的,不是栏目列表页。 - 一致性优先。让“内容 URL”这一套可定制,栏目 / 分类保持干净稳定,整站 URL 既不乱、又能满足个性化诉求。
- 还有个安全细节。VVCMS 对非内容路由,凡以
.html结尾的请求直接 404(源码注释“不做兼容”),避免有人拿.html去探测后台或模板文件。
七、给你的落地建议
- 新站:默认干净 URL(不带
.html),除非客户 / 老板明确要求。 - 老站迁移:如果之前是
.html,新站也保留.html并 301 旧链,别让外链和权重蒸发。VVCMS 的“一套 URL”设计天然支持你定一套后长期不变。 - 别纠结扩展名:把精力花在内容质量、外链、速度、结构化数据上,
.html纯属心理安慰。 - 真要 .html:开 VVCMS 后台那个开关就行,5 秒钟的事,然后该干啥干啥。
结语
伪静态的尽头是——知道它不重要,但懂得给用户一个体面的选项。VVCMS 的内容重写就是这样:它不替你迷信 .html,也不替你否定 .html,它只是把决定权,连同“只一套 URL、不重复、不生成物理文件、只动内容不动栏目”这些安全网,一起交还给你。