﻿---
title: EdgeOne Pages中文路径 404 故障排查与迁移实践
tags:
  - Blog
excerpt: 记录一次在官方 Bug 修复前的站点自救
date: 2026-04-16
updated: 2026-05-08 22:34:07
---

<script data-swup-reload-script type="module" src="/js/components/tab.js"></script>

昨晚宿舍挂壁[^1]，关于这间宿舍的硬件条件，槽点实在太多，这里先不讲。

Chrome 中打开 Blog， 回忆《沙东往事》[^2]。发现好几篇旧文直接 [404](https://vluv.space/404.html)。

经过一番排查后发现了规律：凡是路径中包含中文字符的文件名，访问时全部 404；而纯英文路径则表现完全正常。

作为对照组，Cloudflare Pages 上都是可正常访问的。大概率不是我的问题。

于是在微信交流群里反馈了该情况，获得了 0 个人的搭理。

找官网客服提交工单才是正确姿势。经过与技术支持的沟通，确认这是 EdgeOne 后端的一个 Bug，预计会在下一个版本中修复。具体的发版修复进度会在微信群通知。

考虑到发版周期不确定，我不打算原地等死，决定先搞个权宜之计（Workaround）。以下是对此次迁移修复过程的记录。

## 问题背景

我的 Blog 构建产物结构非常简单：

<script data-swup-reload-script type="module" src="/js/components/tree.js"></script>
<x-tree root="构建产物">

- 琅琊台
  - index.html
- index.html
- sitemap.xml
- rss.xml
- robots.txt

</x-tree>

以[[langya_terrace|琅琊台]] 这篇文章为例，对应的访问路径就是，`https://vluv.space/琅琊台` 或`https://vluv.space/琅琊台/index.html`

### A Interlude 🎞️

更早之前，EdgeOne 某次更新后，所有文章都 404，因为它不再支持省略 `index.html`。

当时我写了个 edgeone.json 做 workaround，不过官方很快就释出了 hotfix，我以为万事大吉就把配置文件删了

不曾想，这次中文路径又翻车了，hh

## Migration Solution

迁移的核心逻辑分为 3 步：

1. **重命名**：将所有包含非 ASCII（中文）的文件名翻译成纯英文。
2. **配置重定向**：在 edgeone.json 中配置 301 永久重定向，确保旧链接不失效。
3. **更新 Wiki Link**: Obsidian 用户可能会使用双链，修改文件名之后原先的双链就失效了，也要进行处理

虽然手动操作很麻烦，但借助 AI 可以高效完成。

### A Pitfall 🕳

EdgeOne Pages 的 `redirects.source` 仅支持 ASCII 字符，这意味着中文路径必须先进行 **URL 编码（Percent Encoding）**，否则部署校验会报错：

```log
17:22:23.099
> Start validating the configuration file:
17:22:23.105
error in root.redirects.[0].source: char match error
17:22:23.105
error in root.redirects.[1].source: char match error
17:22:23.106
error in root.redirects.[2].source: char match error
17:22:23.106
error in root.redirects.[3].source: char match error
```

### Prompts

现在 LLM 的能力都不错，直接备份 Prompt 想必比一个 outdated 的脚本更实用

<x-tabs>

<x-tab title="Fix 404" active>

````md
**任务描述**  
基于 EdgeOne Pages 的 edgeone.json 规范（redirects.source 仅支持 ASCII），完成以下任务：

**子任务一：生成路径映射文件**  
将所有包含非 ASCII 字符的旧文件名翻译为英文，生成 JSON 映射：  
{ "旧文件名": "new-english-path" }

**子任务二：生成 edgeone.json**  
基于映射文件，输出符合格式的 edgeone.json：

codeJSON

```
{
  "redirects": [
    {
      "source": "/%E4%B8%AD%E6%96%87", 
      "destination": "/new-english-path/",
      "statusCode": 301
    }
  ]
}
```

注：source 必须经过 URL 编码。
````

</x-tab>

<x-tab title="Fix Wiki Link">

让 Coding Agents 读取先前的 json 文件，然后使用 `{sh} rg` 正则匹配 `[[old_file_name`，然后替换即可。

```md
@filename_translation_map.json 查找 @blog/ 目录下有无[[old_file_name存在，如果有，替换成 [[new_file_name
```

手动查找可使用 `{sh} rg -o '\[\[[\u4e00-\u9fa5]'` 命令

</x-tab>

</x-tabs>

## Why Bother?

为什么费这个劲呢，主要是考量下面几点因素：

1. **用户体验**：防止已收录的链接失效，确保从搜索结果点击进来的用户不会看到 404。
2. **SEO**：如果大量旧链接直接 404，站点会被搜索引擎逐步降权（Deindex），~~阿宾的 SEO 成绩并不理想~~

耽误一些水毕设论文的时间，不过又水了一篇 Blog，我发现了水文守恒定律 🤓

聊到毕设，又想吐槽 Microsoft Word 了，也先不讲了，恐怕篇幅过长。

## Postscript

### 2026.4.17: 还有第二关？🤯

忘了Twikoo 的评论也要迁移。步骤：

1. 访问 MongoDB Atlas
2. 点击Data Explorer
3. 选择存储 Twikoo 数据的集群后，点击Connect
4. 选择 twikoo comment 表
5. 执行 query，分别查询 `{url: { $regex: /[^\x00-\x7F]/ }}` 以及 `{url:{$regex:'%'}}`；前者查询包含非 ASCII 字符的 URL，后者筛选已被编码的中文 URL
6. 更新 document 里的 url 和 href 字段

🥲 谁曾想还要在 MongoDB 里玩正则，这迁移工作果真是“冲繁疲难”四字全占，虽说未来上班后，遇到的迁移工作会比这麻烦的多

要是还有 AI 额度的话，集成 MongoDB MCP，输入 prompt ，LLM 就能帮我完成这些重复工作了。之前一次迁移 Twikoo 是这样做的，但结束实习后，免费 AI 也没了

至于访问计数……懒得迁移了，当数字亡灵吧🪦，还有论文要水

[^1]: “挂壁”主要指一种“没工作、低成本、闲散自由”的生活状态，最初源自深圳“[三和大神](https://www.google.com/search?q=%E4%B8%89%E5%92%8C%E5%A4%A7%E7%A5%9E&mstk=AUtExfCn1xGzMxOSpo1J7HTrOdmB6YCXXIR4EYw-MX3m4xQiUQ2LAE1TSBG262l4o-_MyBvpJvxcQruFofXQQ5aCKHodyfb8sjt9lWyUw6lRoTbh2LhdvyotYaA_3t6PeW4jhjipR7IFxihZ6HNQMf0gdPsUdnwl06WyLgstrtcuk9pxIfM&csui=3&ved=2ahUKEwjX6P2mjPKTAxXqOTQIHf_hB6MQgK4QegQIARAB)”的亚文化，意为靠做临时工维生、赚够最低生活费就停止工作、过一天算一天的年轻人。该词后来延伸为自嘲式的消极、懒散或身处进退两难的困境。
[^2]: 梗来源：《东百往事》。一般认为，该词广义上涵盖了 2016 年前后[东北地区](https://zh.moegirl.org.cn/%E4%B8%AD%E5%9B%BD%E4%B8%9C%E5%8C%97%E5%9C%B0%E5%8C%BA "中国东北地区")网络主播以及其他地区的某些网络主播的全部短视频，这些视频因其明显的地域特色而广为流传；狭义上专指同时期虎哥、刀哥、杀马特团长等人所拍摄的一个短视频系列。~~豆瓣评分 9.7。~~ [东百往事 - 萌娘百科 万物皆可萌的百科全书](https://zh.moegirl.org.cn/%E4%B8%9C%E7%99%BE%E5%BE%80%E4%BA%8B)
