WordPress 伪静态与固定链接:404 循环与 Nginx rewrite 核对(2026)
摘要:在 WordPress 后台把固定链接改成文章名等伪静态之后,内页变成 404,或改 Nginx 规则后出现重定向循环时,按官方文档核对「设置 → 固定链接」是否已保存,以及 Nginx 是否具备 try_files $uri $uri/ /index.php?$args;。DNS、证书和 CDN 总排查见前文;查询日期 2026-11-08。只放官网普通链接(affiliate_later)。
依据:WordPress《Settings Permalinks screen》、WordPress《Customize permalinks》、WordPress 开发者手册《Nginx》、nginx.org
try_files、nginx.org rewrite 模块、宝塔面板《站点伪静态规则配置》。查询日期:2026-11-08(北京时间)。只放官网普通链接(affiliate_later: 1)。配置以你当前 WordPress、Nginx 版本和官方当前页为准。不构成运维建议;不写未核对的端口、TTL 或错误码数字。
刚把固定链接从 ?p=123 改成「文章名」,首页还能打开,点进任何一篇文章却是 404;或者刚改完一段 rewrite,浏览器提示重定向次数过多,Nginx 错误日志里出现 rewrite 循环。DNS、证书和 CDN 怎么一层层查,见前文网站 404/502:DNS、证书、源站与 CDN。DNS、证书、CDN 见前文,本文只谈固定链接与伪静态:后台「设置 → 固定链接」改成 pretty permalink 之后,Nginx 缺少 try_files 或 rewrite 写错,会让内页 404,或让请求在规则里打转。若你看到的是 502、504,而不是 404,另见 Nginx 502/504 排错。
1. 先在后台改固定链接,并点保存
WordPress 文档把永久链接分成三类。《Customize permalinks》写道:
- Plain(朴素链接):形如
http://example.com/?p=N。文档称这是安装时的默认设置,在各种服务器环境都能工作。 - Pretty Permalinks(伪静态):形如
http://example.com/2012/post-name/或带完整日期的路径。 - Almost Pretty:在伪静态路径前加上
/index.php/,例如http://example.com/index.php/yyyy/mm/dd/post-name/。

?p=N,Pretty Permalinks 形如 /2012/post-name/(2026-11-08 截自官方文档)后台入口是 设置 → 固定链接(英文界面为 Settings → Permalinks)。《Settings Permalinks screen》列出的常见选项包括:Plain(示例 http://www.sample.com/?p=123)、Day and name、Month and name、Numeric、Post name(示例 http://www.sample.com/sample-post),以及 Custom structure。自定义时只使用文档给出的结构标签,例如 %year%、%monthnum%、%day%、%postname%、%post_id%、%category%、%author% 等;不要把网站域名填进这个输入框。文档提醒:自定义结构应以 %post_id% 或 %postname% 结尾,WordPress 才能定位到每一篇文章。
同一页写得很明确:必须点击屏幕底部的 Save Changes,新设置才会生效。保存之后,若服务器是 Apache 且 .htaccess 可写,页面会提示 “Permalink structure updated”;若不可写,WordPress 会在页面下方给出一段 mod_rewrite 规则,需要你手动拷进 .htaccess。文档还注明:打开固定链接设置页本身就会刷新一次重写规则,不必为了刷新而再保存一次。

到这里,后台只是记住了「URL 应该长什么样」。下一步取决于 Web 服务器能不能把这种路径交给 index.php。
2. Nginx 不会替你写伪静态规则
WordPress 开发者手册《Nginx》把这件事写在开头:Nginx 没有 Apache 那种目录级 .htaccess,也没有 IIS 的 web.config。所有配置必须由管理员写在服务器级配置里,WordPress 不能像在 Apache 或 IIS 上那样自行改服务器配置。因为没有 .htaccess 能力,它也 不能自动生成 rewrite 规则。手册还写:如果不改安装,固定链接里会被加上 index.php,也就是上一节的 Almost Pretty。

所以现场常见的现象是:后台已经选了「文章名」并点了保存,用 ?p=123 还能打开文章,用 /sample-post 却 404。此时优先去看 Nginx:它会把这个路径当成磁盘上的真实文件去找,找不到就直接返回 404,请求根本没有进到 WordPress。
3. 官方单站点规则里的 try_files
WordPress《Nginx》手册「General WordPress rules」给单站点准备的 location / 是这样写的(以 2026-11-08 打开的页面为准,不要默写别处看来的过时片段):
location / {
# This is cool because no php is touched for static content.
# include the "?$args" part so non-default permalinks doesn't break when using query string
try_files $uri $uri/ /index.php?$args;
}
注释专门说明:带上 ?$args,使用非默认固定链接时,带查询串的地址才不会断。

location / 中使用 try_files $uri $uri/ /index.php?$args;(2026-11-08 截自官方文档)nginx.org 对 try_files 的说明是:按指定顺序检查文件是否存在,用第一个找到的文件处理请求;路径按 root 或 alias 拼出来;名字末尾加 / 可以检查目录。如果前面的文件都不存在,就对最后一项 uri 做一次内部跳转。对应到上面这行:先看磁盘上有没有这个文件或目录(静态资源直接返回),没有再交给 /index.php?$args,由 WordPress 按固定链接去解析。
缺了这行,Pretty Permalink 就会整站或成片内页 404。首页有时仍能打开,是因为 index index.php; 还在处理 /,并不代表伪静态已经生效。改完配置后用 nginx -t 检查语法,再按你的发行版方式重新加载 Nginx,然后同时打开 ?p=文章ID 和伪静态地址做对比。
4. 404 和重定向循环分别怎么核对
先分清两种现场。
内页 404,首页和后台都还在:优先核对本节上面的 try_files。用浏览器或 curl -I 对比同一篇文章的朴素链接和伪静态链接。朴素链接 200、伪静态 404,就可以把排查收在「固定链接 + Nginx 规则」,而不要先去改 DNS 或清整站 CDN。
浏览器提示重定向次数过多,或页面变成 500:先看 Nginx 错误日志。rewrite 模块文档写明:如果请求 URI 被改写,模块会重新找 location,这个循环最多 10 次。文档还举了一个会踩坑的例子:把带 last 标志的 rewrite 放进一个改写后仍会匹配到的 location 里,Nginx 会转满 10 圈并返回 500。正确做法是按文档把 last 换成 break,让处理留在当前 location,而不是重新匹配。

last,会转满 10 圈并返回 500;应改用 break(2026-11-08 截自官方文档)ngx_http_core_module 也写了另一条相关限制:内部跳转(error_page、try_files、rewrite 等)每个请求最多 10 次,用来防止错误配置造成处理环;达到上限时返回 500,错误日志里可以看到 rewrite or internal redirection cycle。排查时可在对应 server 或 location 里临时打开 rewrite_log on;,模块会把处理过程记到 error_log 的 notice 级别,看完再关掉。
无条件把所有请求 rewrite 到同一个前缀、而改写后的 URI 又再次命中同一条规则,就是这类循环的常见写法。不要从博客里复制「万能 rewrite」;以你打开的 WordPress《Nginx》页和 nginx.org 当前文档为准。
如果 try_files 已经按官方页写好,日志里也没有 rewrite 循环,浏览器却仍报「重定向次数过多」,再回头看 CDN 的 Flexible HTTPS 与源站强制跳到 HTTPS 是否叠在一起。这一层的核对顺序见网站 404/502 排查,本文不展开。
可复制的核对顺序:
[ ] 后台「设置 → 固定链接」已选择目标结构,并点击了 Save Changes
[ ] 朴素链接 ?p=ID 能打开,伪静态地址 404:优先查 Nginx 的 try_files
[ ] location / 中存在官方页上的 try_files $uri $uri/ /index.php?$args;
[ ] nginx -t 通过,并已重新加载配置
[ ] 若出现 500 或重定向过多:查 error_log 是否有 rewrite or internal redirection cycle
[ ] rewrite 若写在会再次匹配的 location 内,核对标志是 last 还是 break
[ ] 规则本身无循环时,再按前文核对 CDN 加密模式与源站 HTTPS 跳转
5. 用宝塔时:选 WordPress 预置规则,不要自己编一段
若服务器装的是宝塔面板,官方文档《站点伪静态规则配置》(页面注明更新于 2026 年 7 月 7 日)给出的入口是:登录面板,点左侧导航栏的 网站;在站点列表里点对应站点的域名;在弹出窗口左侧点 伪静态。文档写明:面板提供了 WordPress、ThinkPHP、Laravel、Discuz 等预置规则,也可以编辑或添加自定义规则。若设置伪静态之后网站无法正常访问,官方说明是先尝试清除规则。

预置规则的具体内容以面板当前下拉选项为准,本文不另行编写一段「宝塔 WordPress 伪静态」。选好 WordPress 并保存后,再回到 WordPress 后台打开一次固定链接设置页(文档说打开该页会刷新重写规则),然后用一篇文章的伪静态地址做访问核对。
风险与范围
本文整理的是 2026-11-08 打开的公开文档,用来核对「后台固定链接 + Nginx 伪静态」这一层,不能代替你自己的变更窗口和回滚准备。改 Nginx 配置、套用或清除伪静态规则都可能让站点暂时打不开;生产环境先在低峰操作,保留改前配置。具体指令和路径以你当前面板、WordPress 与 Nginx 版本为准。涉及备案和国内访问策略时,另遵云厂商与主管部门要求。