分类名里带斜杠 前端用 encodeURIComponent 生成 /tag/a%2Fb 浏览器访问正常 Nginx 默认先解码再匹配 location 请求落到 /tag/a/b 两级目录 直接 404 日志里能看到成片的 /tag/a/b 请求

一开始怀疑是「内链输出的编码大小写不一致 %2f 与 %2F 各一份」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。Nginx 默认对 URI 解码后再匹配 location %2F 变成路径分隔符。也可能是应用层又把已解码的路径重新编码 生成两套地址。

还有一种情况,CDN 对 %2F 的归一化策略与源站不同。

第一件事是确认请求以什么形式到达源站

grep -i '%2f' access.log | tail -5

保留编码后的斜杠 不让 Nginx 合并

merge_slashes off;

随后把分类名里的斜杠换成连字符

UPDATE wp_terms SET slug = REPLACE(slug,'/','-');

等前面都确认过,再验证编码地址与普通地址各自返回码

curl -s -o /dev/null -w '%{http_code}\n' 'https://www.example.com/tag/a%2Fb'

改完先别撤,确认这几项。%2F 地址不再落到错误目录 内链统一输出连字符版本 日志里两级目录 404 消失。

能不用编码斜杠就别用 分类 slug 里出现斜杠 迟早会在某一层被拆开。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189