WordPress 固定链接怎么设:中文、层级与伪静态冲突排查
固定链接不是「设置一次就完事」的选项。它同时决定了三件事:URL 长什么样、中文标题怎么进入 URL、以后换结构时旧链接怎么活下来。绝大多数「改了固定链接全站 404」的事故,不是 WordPress 出错,而是改完没补 301,或者服务器压根没配伪静态。这篇按这三个层面拆。
一、结构怎么选:先看内容量级,再看美观
后台路径是「设置 → 固定链接」。可选结构有六种,实际常用的就四种,代价差别很大。
| 结构 | 示例 | 适用 | 代价 |
|---|---|---|---|
| /%postname%/ | /about/ | 企业官网、博客,页面数量在几百以内 | 层级浅、好分享;文章标题重复时 slug 冲突,WordPress 自动加 -2 |
| /%category%/%postname%/ | /news/2026-annual-meeting/ | 资讯量大、分类明确的站 | 调整分类会连带改 URL,必须同步做跳转,否则老链接全断 |
| /%year%/%monthnum%/%postname%/ | /2026/11/about/ | 强调时效的资讯站、期刊型内容 | URL 变长;中文站里日期段没有搜索价值,纯占位 |
| /archives/%post_id% | /archives/123 | 内容长期维护、怕改结构的老站 | 不含关键词,改标题也不会变,但 SEO 上没有加分 |
给一个实际判断:内容少于 500 篇,用 /%postname%/;超过 500 篇且有明确栏目,用 /%category%/%postname%/,但分类层级只做一级,别做 /news/company/2026/ 这种四级路径。层级越深,后期迁移要重写的规则越多。
同一页面底部还有「分类目录前缀」和「标签前缀」两个可选项,默认是 category 和 tag。改成 news、topic 这类短词能让 URL 更干净,但改了同样要补 301,而且旧前缀的归档页会全部失效。要改就在上线前一次改完,别等内容收录了再动。
还有一条:结构定下来就别再动。改一次结构,等于把已收录的地址全部作废,重新提交 sitemap 到恢复收录通常要几周。真要改,按第三节补 301,别裸奔。
二、中文固定链接:编码问题不在 WordPress 这一端
标题是中文时,WordPress 生成的 slug 是空的,保存草稿后会把标题做 URL 编码塞进去,实际链接长这样:
https://example.com/2026/11/%e4%bc%81%e4%b8%9a%e5%bb%ba%e7%ab%99%e6%94%bb%e7%95%a5/
浏览器地址栏会显示成中文,复制出来的却是这串百分号。三个实际影响:分享到微信、QQ 时链接被截断或识别不出;部分统计工具的「页面路径」报表按编码归类,同一篇文章出现两三个版本;CDN 缓存键按编码后的字符串算,大小写不同的编码(%E4 与 %e4)会被当成两个资源,缓存命中率下降。
处理办法按推荐顺序排:
- 手工改 slug。在「文章 → 所有文章 → 快速编辑」里把 slug 改成英文或拼音,比如 qiye-jianzhan。这是最稳的做法,改动量小,也不依赖插件。
- 用插件自动转拼音。适合已经有几百篇存量文章的站,装完批量重写一次 slug,然后按第三节补跳转。插件停用后已生成的 slug 不会回退,这点可以放心。
- 保留中文 slug。技术上没问题,WordPress 和主流服务器都能处理,只是分享和统计体验差一些。外贸站、要给海外客户看的站不要用中文 slug。
数据库层面还有一点:中文 slug 依赖 utf8mb4 字符集。如果表还是 utf8(三字节),生僻字和 emoji 标题会写入失败,表现为保存文章时报 Incorrect string value。检查方式是看 wp_posts 表的字符集,不是 utf8mb4 就先备份再转,转换方法见 数据库优化。
三、改了之后旧链接 404:三种补 301 的做法
WordPress 有一个自带的兜底机制:修改文章的 slug 时,旧值会存进 postmeta 的 _wp_old_slug,前台访问旧地址会自动 301 到新地址。但它只对「同一篇文章改 slug」有效,而且文章 ID 必须没变。批量换结构、换分类前缀、换域名,这个机制都不管用。
做法一:插件做正则跳转
数量在几十条以内,用 Redirection 这类插件最省事。源地址支持正则,比如把 /archives/(d+).html 指向 /archives/$1/,一条规则覆盖全部旧文章。装完记得在「工具 → Redirection」里看 404 日志,跑一周,把真实出现的旧地址逐条补上,比凭记忆列清单可靠。
做法二:nginx 直接写规则
规则数量固定、希望零插件依赖时,写在站点配置里更快。注意 permanent 表示 301,redirect 是 302,做迁移必须用 301。
# 旧结构 /archives/123.html 跳到新结构 /archives/123/
rewrite ^/archives/(d+).html$ /archives/$1/ permanent;
# 去掉重复的 /category/ 前缀
rewrite ^/category/category/(.*)$ /category/$1/ permanent;
# 旧域名整站跳新域名,保留路径
server {
listen 80;
server_name old.example.com;
return 301 https://new.example.com$request_uri;
}
写完用 curl -I 抽查十条,确认状态码是 301 而不是 302,Location 指向的地址不带双斜杠。
做法三:整站迁移时用 SQL 批量替换
换域名属于这一类的典型场景,完整流程在 迁移搬家 里写过。这里只强调一条:不要改 wp_posts 表的 guid 字段。guid 是文章的唯一标识,改了会让 RSS 订阅者重复收到全部旧文,而它对前台链接没有任何作用。要改的是 wp_options 里的 siteurl、home,以及文章内容里写死的绝对地址。
四、nginx 下固定链接不生效的排查顺序
按这个顺序走,每一步都能排除掉一类原因,不要跳步。
- 先访问
/index.php?p=123。能打开说明 PHP、数据库、文章都正常,问题纯在伪静态;打不开就先修站点本身。 - 回后台「设置 → 固定链接」点一次保存。这一步会刷新 WordPress 内部的重写规则缓存,有时只是缓存脏了。
- 看站点配置里 location / 有没有 try_files。没有就是没配伪静态,具体规则见 固定链接 配套的配置说明。
- 看 include 是否被覆盖。在宝塔里改过 PHP 版本、换过域名、开过 HTTPS,都可能让伪静态的 include 掉出配置文件。
- 关掉缓存插件和 CDN。这两处会把旧的 404 缓存住,规则改对了前台依旧是 404,很容易误判。
- 看 access.log。请求是打到 index.php 还是直接 404,一眼能分清是服务器层还是 WordPress 层。
| 现象 | 判断 | 动作 |
|---|---|---|
| 首页正常,所有内页 404 | 伪静态未生效 | 补 try_files 或面板选 WordPress 模板 |
| 文章页正常,分页 /page/2/ 404 | 规则里漏了 $args 或分页参数被吞 | 改成 try_files $uri $uri/ /index.php?$args |
| 后台固定链接页保存后跳 404 | 后台也被规则重写了 | 给 /wp-admin/ 加单独的 location 放行 |
| 只有手机端 404 | CDN 或移动端缓存 | 清 CDN,检查是否有单独的移动站配置 |
| 改了结构,新链接正常、老链接 404 | 缺 301 | 按第三节补跳转规则 |
五、三个高频追问
固定链接里带 .html 好不好
技术上没区别,/%postname%.html 也能正常工作,看起来像静态页。但一旦上线就别再去掉后缀,去掉等于全部改地址。老站从静态页迁过来的,保留 .html 反而省事,可以做一条无后缀到带后缀的 301 兜底。
改完结构,百度收录掉了怎么办
先确认 301 是否真的生效——用 curl 看状态码,不要只看浏览器。301 生效后,在搜索资源平台重新提交 sitemap,同时用「链接提交」把新的栏目页推一遍。恢复周期通常在两到六周,期间不要再改第二次结构。相关设置可以对照 SEO 优化 里的地址规范化部分。
能不能两套结构并存
可以,但要靠 301 或 canonical 指明主地址,不能让两套都返回 200。两套 200 会让搜索引擎按重复内容处理,权重被分散。最简单的做法是保留旧结构做 301,只让新结构返回 200。
固定链接这块出问题,九成是「改之前没规划、改之后没补跳转」。存量站要动结构,先把旧 URL 全量导出,改完逐条核对,比事后从 404 日志里捞要省事得多。拿不准的可以把站点结构和 nginx 配置发到 web@wordpressx.com,或打 13280692153,我们看一遍给你判断。