许多个人站长在使用 Nginx 部署 WordPress 时,启用伪静态(Permalinks)后,首页正常,但点击文章链接就会出现 404 错误。很多人会从网上复制代码粘贴,但问题依旧。这是因为 Nginx 的工作原理与 Apache 不同,它不会自动尝试重写请求,必须通过核心指令显式配置。
为什么照抄规则还会报 404?
Nginx 是一款高性能的 Web 服务器,它的特点是高效和配置严格。当用户访问一个像 /2023/my-post/ 这样的伪静态链接时:
- Nginx 尝试在网站根目录寻找 /2023/my-post/ 这个物理文件或目录。
- 由于这个文件不存在,如果配置缺失或错误,Nginx 会直接返回 404。
Apache 通过 .htaccess 文件中的 RewriteRule 可以自动处理重写,但 Nginx 需要使用 try_files 指令来告诉它:如果找不到请求的文件或目录,就将请求内部重定向到 index.php,让 WordPress 核心去处理路由。
如果你的配置中缺少或错误地使用了 try_files,则伪静态必定失败。
核心解决方案:使用 try_files
正确的 WordPress Nginx 伪静态规则必须包含以下核心结构,并放置在你的 server 配置块中。
以下是一个完整且标准的 Nginx 配置示例:
server {
listen 80;
server_name www.example.com example.com;
# 网站根目录,请确保路径正确
root /var/www/wordpress;
index index.php index.html index.htm;
# 核心伪静态处理块
location / {
# 关键指令:
# 1. 尝试查找 $uri (文件)
# 2. 尝试查找 $uri/ (目录)
# 3. 如果前两者都找不到,则将请求转发给 /index.php 并带上原始参数 $args
try_files $uri $uri/ /index.php?$args;
}
# PHP-FPM 处理块
# 确保 fastcgi_pass 指向正确的 PHP-FPM Socket 或 IP:Port
location ~ \.php$ {
# 如果是文件不存在,返回 404
try_files $uri =404;
include fastcgi_params;
# **重要:根据你的系统环境修改下面的路径或端口**
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 阻止访问隐藏文件和目录
location ~ /\. {
deny all;
}
}
重点解析 try_files $uri $uri/ /index.php?$args;
这行代码是解决 WordPress 404 问题的关键:
- $uri: Nginx 首先检查请求的 URI 是否对应一个静态文件(例如 CSS、图片)。
- $uri/: 如果不是文件,则检查它是否对应一个目录。
- /index.php?$args: 如果前两者都找不到,Nginx 会执行一个内部跳转到 /index.php,并将用户请求的所有原始参数 ($args) 传递给它。这样,WordPress 就可以加载并根据参数解析出正确的文章内容。
实施与验证步骤
- 编辑配置: 找到你的 Nginx 站点配置文件(通常在 /etc/nginx/sites-available/ 或 /etc/nginx/conf.d/ 下),将上述 location / 块替换或添加进去。
- 检查 Nginx 配置: 运行以下命令,确保配置文件语法正确。
sudo nginx -t - 重载 Nginx: 如果检查通过,重载服务使新配置生效。
sudo systemctl reload nginx
常见额外排查点
如果应用了正确的 try_files 规则后仍然出现 404,请检查以下两点:
- PHP-FPM 配置路径: 确认你的 location ~ .php$ 块中的 fastcgi_pass 指令指向了正确的 PHP-FPM 服务地址(Socket 路径或 IP:Port)。如果 PHP-FPM 服务未运行或路径错误,Nginx 将无法处理 .php 文件,可能导致伪静态重写到 index.php 后,该文件本身也无法执行而返回 404。
- WordPress 后台设置: 登录 WordPress 后台,进入 设置 -> 固定链接 (Permalinks),确认你选择了一个非“朴素”的链接结构(例如:月份和名称)。即使规则正确,如果后台设置是朴素模式,伪静态也不会生效。
汤不热吧