本文约 3,713 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一个改了就回不去的选择
WordPress 默认的固定链接是”朴素”模式:/?p=123。很多新手建站半年后才想起来改,改成 %postname% 之后发现:所有旧文章 404,百度收录的历史 URL 全掉,外链全部失效。
固定链接是全站 URL 的骨架,决定了三件事:搜索引擎对你站点结构的理解、URL 里关键词的权重传递、以及未来改版的迁移成本。这一篇把选择的逻辑讲透。
原理分析:固定链接是怎么工作的
WordPress 的 URL 美化依赖重写规则(rewrite rules),它存在 wp_options 的 rewrite_rules 字段里,是一张巨大的正则映射表。
流程是:访客请求 /2026/10/hello-world/ → 服务器(Nginx/Apache)把请求转给 index.php → WordPress 拿这个路径去匹配重写规则 → 解析成 ?p=123 之类的查询参数 → 查询数据库 → 输出。
所以固定链接有两层配置,缺一不可:
- WordPress 层:设置 → 固定链接,选结构并保存(生成
rewrite_rules); - 服务器层:Nginx 的
try_files或 Apache 的.htaccess重写规则,把请求转给index.php。
只改 WordPress 而服务器没配伪静态,就会全站内页 404——这是新手最常撞的墙。
生成后的规则可以这样看:
wp rewrite list --format=csv | head -20
六种结构对比:
| 结构 | 示例 | 优点 | 缺点 |
|---|---|---|---|
| 朴素 | /?p=123 |
永不失效 | 无关键词,SEO 差,不友好 |
| 日期和名称 | /2026/10/10/sample/ |
有时间戳 | Google 和百度都不喜欢,长 URL,改日期即变 |
| 月份和名称 | /2026/10/sample/ |
同上稍短 | 同上 |
| 数字 | /archives/123 |
短 | 无语义,且暴露 ID |
| 文章名 | /sample-post/ |
短、含关键词、最推荐 | 中文别名可能被转码 |
| 自定义(带分类) | /%category%/%postname%/ |
层级清晰 | 文章换分类 URL 就变,多层分类时 URL 很长 |
保姆级实操
第一步:选择结构(决策逻辑)
结论先行:大多数站点选”文章名”(/%postname%/)。
理由:
- URL 最短,关键词权重最集中;
- 不含日期,内容更新后 URL 不变,避免”内容新鲜度”被日期拖累;
- 不含分类,换分类不用做 301;
- 不含 ID,不暴露站点规模。
几个例外情况:
- 新闻站/时效性强的站:可以用
/%postname%/同样,日期不建议。Google 明确表示 URL 里的日期会让用户判断内容过期。 - 多语言站:建议在前面加语言前缀,如
/en/%postname%/(Polylang/WPML 会自动处理)。 - WooCommerce:产品 URL 单独在 WooCommerce → 设置 → 产品 → 固定链接 里配,通常保留
/product/%postname%/,避免和文章 URL 冲突。
第二步:配置服务器伪静态
Nginx:
location / {
try_files $uri $uri/ /index.php?$args;
}
Apache:确保 .htaccess 可写,WordPress 会自动写入:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
宝塔面板:网站 → 设置 → 伪静态 → 选 “wordpress” 模板 → 保存。
第三步:处理中文别名
中文站用拼音或英文别名,不要用中文标题直接当别名。中文 URL 会被浏览器转成 %E4%B8%AD%E6%96%87 这种百分号编码,很长且不利于分享,部分老爬虫处理也有问题。
装插件 “WP Pinyin Slug” 或用代码自动转:
add_filter( 'sanitize_title', function( $title ) {
if ( preg_match( '/[\x{4e00}-\x{9fa5}]/u', $title ) ) {
// 需要拼音库,这里示意
$title = sanitize_title_with_dashes( $title );
}
return $title;
});
实际上更简单的办法是:发文时在”别名”框手工填拼音,或用 SEO 插件(RankMath)自带的 slug 建议功能。
第四步:改固定链接时的 301 重定向(最关键)
如果是从 /?p=123 或 /%year%/%monthnum%/%postname%/ 改成 /%postname%/,必须做 301。
方法 A:用插件”Redirection”
安装后它会自动检测固定链接变化并提示创建重定向规则。或者手工加:
- 源 URL:
/(\d{4})/(\d{2})/(\d{2})/(.*) - 目标 URL:
/$4 - 类型:301
方法 B:Nginx 规则
# /2026/10/10/slug/ -> /slug/
rewrite ^/\d{4}/\d{2}/\d{2}/([^/]+)/?$ /$1/ permanent;
# /archives/123 -> 需要查库,不建议 Nginx 做,用插件
方法 C:代码层(最稳,能处理 ID 型旧链接)
add_action( 'template_redirect', function() {
if ( is_404() && isset( $_GET['p'] ) ) {
$id = absint( $_GET['p'] );
$url = get_permalink( $id );
if ( $url ) {
wp_redirect( $url, 301 );
exit;
}
}
});
第五步:提交改版规则
- 百度站长平台 → 网站改版 → 添加改版规则(支持规则改版,能最短时间完成新旧 URL 映射);
- Google Search Console 无需特殊操作,301 会被自动跟随,但要重新提交 sitemap。
第六步:验证
wp rewrite flush
curl -I https://example.com/某文章别名/
curl -I https://example.com/2026/10/10/某文章别名/ # 应返回 301
常见踩坑与失败案例
- 案例一:改了固定链接结构,前台内页全 404。原因是 Nginx 没配
try_files。WordPress 设置和服务器伪静态是两件事。 - 案例二:用
/%category%/%postname%/,后来调整分类结构,几百篇文章 URL 全变,没做 301,百度收录掉了一半。这是选择带分类结构最大的风险。 - 别名和页面 URL 冲突:一篇文章别名叫
about,同时有个页面别名也叫about,会导致其中一个打不开。加后缀区分。 /blog/前缀:如果文章 URL 是/blog/%postname%/,记得设置 → 固定链接 → 自定义结构里写/blog/%postname%/,同时分类基础要留空,否则分类页变成/blog/category/xxx/。- 改完后台 404:跑一次
wp rewrite flush,或去设置 → 固定链接 点”保存更改”(不需要真的改)。 - 分页 URL:
/page/2/这种分页在新结构下也要测,尤其是首页分页和分类分页。 - WooCommerce 产品 URL 改了之后购物车失效:产品的
product基础改了要同步刷新,并且清空 WooCommerce 的缓存(WooCommerce → 状态 → 工具 → 清空 transients)。
总结
固定链接的最佳实践是:建站第一天就定成 /%postname%/,同时配好服务器伪静态;如果已经用了别的结构要改,必须配套做 301 重定向 + 向百度提交改版规则 + 重新提交 sitemap。中文站额外注意别名用拼音不用中文。这一项属于”改一次伤筋动骨”的配置,宁可前期多花十分钟想清楚,也不要后期花十天补救收录。
