Nginx Rewrite规则配置求助:URL重写后出现404错误
解决Nginx URL重写导致的404问题
你的配置出现404的核心原因是重写规则陷入无限循环,同时可能缺少PHP文件的执行配置。以下是具体修复步骤:
1. 修复重写规则的循环问题
当前的location ~ ^\/(.*)\.php$会匹配所有.php结尾的请求,包括重写后的/index.php,这会导致请求被反复重写:
- 初始请求
/somepage.php→ 重写为/index.php?page=somepage - 重写后的请求依然匹配
.php规则 → 再次重写为/index.php?page=index - 循环多次后Nginx终止请求,返回404
修改location规则,用否定前瞻断言排除index.php,避免循环:
location ~ ^/(?!index\.php)(.*)\.php$ { rewrite ^/(.*)\.php$ /index.php?page=$1 last; }
2. 确保存在PHP执行配置
如果Nginx配置中没有处理PHP文件的规则,重写后的index.php会被当成静态文件返回404。必须添加以下配置让Nginx解析PHP:
location ~ \.php$ { include fastcgi_params; # 替换为你的PHP-FPM地址,可能是socket或IP:端口格式 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 可选:防止PHP解析漏洞 fastcgi_param PATH_INFO $fastcgi_path_info; }
3. 验证配置
修改完成后,重启Nginx生效:
sudo systemctl restart nginx
此时访问mysite.com/somepage.php会被正确重写为index.php?page=somepage,PHP代码会加载对应的页面。
补充说明
你的PHP逻辑本身没有问题,只要page参数正确传递,就能正常匹配并加载对应页面。
内容的提问来源于stack exchange,提问作者István Szabó
相关产品推荐
相关产品推荐

