分类名里带斜杠 前端用 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 里出现斜杠 迟早会在某一层被拆开。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
