跳到主要内容

Cloudflare Pages 不显示 .html 和 末尾斜杠问题

2026.5.18

遇到的问题

在使用 Cloudflare Pages 时可能会发现 其不会显示 html 文件的扩展名
当尝试访问的页面是以 .html 结尾时其会被重定向到一个不带扩展名的路径
例如输入地址 /1.html 访问后被重定向到了 /1

此外在输入地址的时候 有些页面路径的末尾并没有 斜杠
但访问后会被重定向到带末尾斜杠的路径 例如 /path/abc 重定向到 /path/abc/

这个问题比较多见于静态网站生成器例如 Hugo、Hexo、Jekyll 等
本博客使用的 Docusaurus 也存在这个问题


Pages 处理特征

Cloudflare Pages 处理行为参考:

输入的原始 URL实际寻找的文件浏览器地址最终栏显示的 URL目的/效果
/contactcontact.html/contact直接提供服务
/contact.htmlcontact.html/contact自动重定向(去掉 .html 后缀)
/about/about/index.html/about/直接提供服务(目录默认页)
/about/index.htmlabout/index.html/about/自动重定向(去掉 index.html)

去除 .html 扩展名是 Cloudflare Pages 的一个特性 此特性是强制性的无法关闭 但有办法绕过

至于末尾斜杠问题 其实和静态站点生成工具所生成的目录结构有关
其生成的物理目录可能为 /path/文章文件名/index.html 而超链接为 /path/文章文件名

这样的链接在CF看来请求的是 /path/文章文件名.html 而然这个文件并不存在 所以发出重定向
重定向到 /path/文章文件名/ 以显示该目录下的 index.html 内容 这种重定向对真人来说没有什么影响
甚至大部分人可能都不会注意到 但这些重定向对SEO有影响

现代 SSG(静态站点生成器)在生成超链接时 大都默认采用无尾随斜杠设计
与之对应的 像 vercel 这样的托管平台会采用 隐式重写(Internal Rewrite)这样一来就不用发重定向
地址栏里依然显示 /path/文章文件名 而显示的内容对应物理目录 /path/文章文件名/index.html

其类似于 Cloudflare Pages 中 _redirects 文件里于内部重写 (Rewrite) 或代理 (Proxy) 的 200 状态码
与之不同的是在 vercel 之类的平台上此为默认行为


解决方法

虽然我们无法关闭这些特性 但是我们可以通过其他的方法来解决问题

显示.html 扩展名 并避免重定向

这个问题主要发生在添加站点认证时 在站点的根目录放置一个包含指定识别码的html文件
有些站长工具支持重定向 而有些不支持例如百度 其中接收到308重定向后会报错

这个时候就可以给验证文件 多添加一个 html 扩展名 即将 1.html 修改为 1.html.html
这样在访问 /1.html 的时候就不会接收到重定向了 有趣的是访问 /1.html.html 会被重定向回来

还有一种方法是使用 .htm 而不是 .html 作为扩展名 不过在站点认证的场景下不太适用
cf pages 只会通过重定向的方式去掉 .html 扩展名 而不会修改 .htm

.htm.html 在含义上没有任何区别 只不过前者满足 8.3 命名规则 此为早期FAT文件系统的限制
其限制文件及目录名主体最多8个字节(英文字符) 扩展名最多3个字节中间以点(.)分隔

在现在的系统中已经没有这种限制 应优先使用 .html 为保持兼容性 .htm 其依然可以使用
CF pages 应该也是处于兼容的考虑 而未对 .htm 扩展名进行调整

末尾斜杠问题

静态网站生成器 在设计的时候其实也考虑到了平台不默认支持隐性重定向的情况
可以通过调整配置文件 使得所生成的内部链接末尾包含斜杠
Docusaurus的配置方法是在 docusaurus.config.js 中添加 trailingSlash: true

示例

...
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'ie12sBlog',
tagline: 'ie12的博客',
favicon: 'img/favicon.ico',
url: 'https://ie12blog.36102025.xyz',
baseUrl: '/',
trailingSlash: true, //新增内容
...

开启后 Docusaurus 会对所有指向内部的链接末尾都加上斜杠
即使其有明确的扩展名 例如将 /rss.xml 变成 /rss.xml/
最简单的解决方法是写完整路径 即包括协议与域名 就像填写站外链接那样

此外Docusaurus还提供 pathname:// 其可以使链接保持原样 不会被添加斜杠或进行其他处理
示例: href: 'pathname:///rss.xml', 注意 前缀后面是 3个斜杠 因为协议本身占 2 个斜杠
后面紧跟的根目录路径占第 3 个


参考