许多个人站长在部署新网站时,习惯性地从网上搜索常用的伪静态(Rewrite)规则,例如WordPress或Typecho的规则,然后直接复制粘贴到自己的Nginx配置文件中。结果,重启Nginx后,除了首页,所有链接都报404错误。
这个问题非常普遍,其核心原因在于环境上下文(Context)和文件查找机制(try_files)的差异。
为什么照搬规则会失败?
Nginx处理请求的流程是:先根据location匹配,然后查找文件。如果找不到文件,就执行rewrite或try_files中的后备指令。
你复制的规则之所以失败,往往是因为以下三个关键点没有匹配好:
1. 错误的网站根目录(root)
Nginx在执行重写之前,需要知道文件在哪里。root指令定义了网站的物理根目录。如果你的server块中定义的root路径(例如 /var/www/html)与你实际的文件路径不符,Nginx无论如何重写,都无法找到目标文件,最终导致404。
2. 缺少或错误的try_files指令
这是导致伪静态404的最主要原因。早期的Apache或Nginx配置可能使用复杂的if语句进行重写。但在Nginx中,官方推荐使用高效的try_files指令来处理伪静态。
如果你复制的规则是旧的if逻辑,或者干脆没有定义文件查找逻辑,Nginx会直接停止处理请求并返回404。
3. location 块的上下文冲突
有些复杂的CMS系统需要将伪静态规则放在特定的location块中。如果你将规则放在错误的location块(例如放在了处理图片资源的location ~ .(jpg|png)$中),它将无法对主URL生效。
规范化的 Nginx 伪静态配置 (使用 try_files)
对于绝大多数使用PHP或Node.js的网站(如WordPress、Laravel等),推荐使用统一且健壮的try_files指令来处理伪静态。
try_files $uri $uri/ /index.php?$args;
这个指令的含义是:
1. 尝试查找用户请求的URI是否为一个文件($uri)。
2. 如果不是文件,尝试查找它是否为一个目录($uri/)。
3. 如果以上都不是,则将请求重写到/index.php,并将原始请求参数($args)传递过去。
示例:标准的 WordPress/CMS 伪静态配置
请确保将你的root路径和fastcgi_pass路径修改为你VPS上实际的配置。
server {
listen 80;
server_name www.yourdomain.com yourdomain.com;
# !!!必须配置正确的网站根目录!!!
root /home/www/yourdomain/public_html;
index index.php index.html index.htm;
# 核心伪静态和文件查找逻辑
location / {
# 如果找不到文件或目录,将请求交给 index.php 处理
try_files $uri $uri/ /index.php?$args;
}
# PHP处理块
location ~ \.php$ {
# 检查文件是否存在,防止未授权执行
try_files $uri =404;
# !!!修改为你的PHP FPM套接字路径!!!
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 禁止访问隐藏文件
location ~ /\.(ht|svn|git) {
deny all;
}
}
实施步骤与故障排查
当你修改完配置后,必须执行以下步骤:
1. 检查配置文件的语法
在重启Nginx之前,使用nginx -t命令检查配置是否有效。
sudo nginx -t
如果输出显示 test is successful,则表示语法正确。
2. 重载 Nginx 服务
不要忘了让Nginx加载新的配置文件。
sudo systemctl reload nginx
# 或者使用 service nginx reload
3. 检查日志
如果仍然是404,请查看Nginx的错误日志文件(通常位于 /var/log/nginx/error.log)。日志会明确指出Nginx尝试查找哪个文件失败了,帮助你定位root路径是否配置错误,或者try_files逻辑是否到达了index.php。
汤不热吧