WordPress Nginx伪静态规则完整生产模板
WordPress 在 Nginx 环境下如果伪静态规则不完整,最典型的表现就是文章页 404,或者后台设置固定链接后首页正常、内页打不开,甚至出现重定向循环。
本文给出一套可以直接放到生产环境的 Nginx 伪静态规则模板,并说明如何放置、如何验证、如何排查最常见故障。
配置前先确认环境
开始之前,先确认三件事,缺一个都可能让规则失效。
- Nginx 已启用 rewrite 模块。大多数编译版本的 Nginx 都自带,你可以在 SSH 执行
nginx -V 2>&1 | grep rewrite,如果看到--with-http_rewrite_module就说明支持。 - WordPress 固定链接已设置为非“朴素”格式。登录后台,进入“设置 → 固定链接”,选择“文章名”或其他格式;如果还是“朴素”,伪静态规则不会触发。
- 当前站点确实使用 Nginx。如果实际是 Apache 或 OpenLiteSpeed,下面这套规则不能直接用。
如果你用的是宝塔面板,可以在“网站 → 设置 → 伪静态”里快速完成配置,不需要手工写文件。
一套完整可复用的 WordPress Nginx 伪静态规则
生产环境不建议只写一行 try_files,需要把静态文件、PHP 请求和固定链接规则一起处理。
以下配置适用于 WordPress 主站放在站点根目录的情况:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
# 核心:所有请求先找真实文件,找不到再交给 index.php
location / {
try_files $uri $uri/ /index.php?$args;
}
# favicon 和 robots 单独处理,减少无意义日志
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 静态文件直接返回,不经过 PHP
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2)$ {
expires 30d;
access_log off;
}
# PHP 请求转发
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/tmp/php-cgi.sock; # 根据实际 PHP 版本和路径调整
}
}
真正决定 WordPress 伪静态是否生效的是这一行:
try_files $uri $uri/ /index.php?$args;
它的含义是:如果请求的地址能匹配到真实文件或目录,就直接返回;
如果匹配不到,就交给 index.php 处理,并把原始参数 $args 一并带上。
没有这行,WordPress 内页就会全部 404。
如果你用的是宝塔面板,操作更简单:打开“网站 → 设置 → 伪静态”,下拉选择“WordPress”,然后保存。
宝塔会自动生成一份可用规则,但保存后建议在浏览器里访问一篇已发布的文章确认效果。
为什么会出现 404 和重定向循环
404 常见原因
try_files没写或写错位置。很多主题或教程只给一段残缺的location /,缺少$uri/或$args,导致文章页打不开。- 伪静态规则被注释或覆盖。手动修改 Nginx 配置时,可能在
server块里重复定义了location /,后面的会覆盖前面的。 - 固定链接缓存未刷新。WordPress 修改固定链接后,如果没保存,重写规则不会生效。
重定向循环常见原因
- 后台“WordPress 地址”和“站点地址”设置不一致。比如站点地址写的是
https://example.com,但请求实际是http://,而服务器又强制跳转 HTTPS,就可能互相跳。 - 强制 HTTPS 的规则写在了没有 SSL 的站点上。如果 Nginx 同时存在
return 301 https://...和rewrite规则,且证书配置不完整,容易出现循环。 - 多套 rewrite 规则叠加。有些用户既在伪静态里写了跳转,又在配置文件里写了其他重写规则,互相冲突。
一个便于理解的结论:WordPress 在 Nginx 下出现 404,90% 以上是因为 try_files 没有正确配置;
出现重定向循环,优先检查后台站点地址和 HTTPS 强制跳转的配合。
配置后如何验证
规则配置完,先检查语法再重载:
nginx -t
systemctl reload nginx # 或 nginx -s reload
然后在本地浏览器访问一篇文章链接,如果页面正常打开,并且地址是固定链接格式,说明伪静态生效。
更严谨的方式是用 curl 看返回状态码:
curl -I https://你的域名/文章别名/
预期返回 HTTP/2 200。
如果看到 301 或 302,需要查看 Location 跳去了哪里,判断是否因协议或路径产生了错误跳转。
建议同时测试首页、分类页、文章页和后台登录页,四类页面都正常才算配置完整。
避坑提示
- 修改固定链接后必须点击“保存”,即使不换格式也要保存一次,否则规则不会刷新。
- 如果使用了缓存插件(如 WP Super Cache、W3 Total Cache),清空缓存后再测试,否则可能看到旧页码或 404。
- 不要随意在伪静态规则里增加 rewrite 跳转,尤其不要和 CDN 回源规则同时使用,否则重定向循环的概率会明显增加。
- 阿里云或腾讯云 CDN 环境下,回源协议和 SSL 设置要保持一致,优先在 CDN 层配置 HTTPS,源站 Nginx 不要同时写强制跳转。
遇到问题时的快速定位思路
如果你按上面的步骤还是有问题,不要急着删规则,按以下顺序排查:
- 用
nginx -t确认语法没问题。 - 看 Nginx 错误日志:默认在
/var/log/nginx/error.log,里面有具体的 PHP 或 rewrite 报错。 - 检查 WordPress 固定链接是否保存成功,必要时在“设置 → 固定链接”再保存一次。
- 临时关闭一键 HTTPS 或强制跳转插件,看是否还有循环。
这套模板已经覆盖了绝大多数生产环境需求。
只要核心的 try_files 完好、后台地址一致、HTTPS 规则清晰,WordPress 在 Nginx 下的伪静态基本不会再出问题。
如果后续更换服务器或迁移站点,优先复用这套配置,再按实际 PHP 路径修改 fastcgi_pass 即可。