nginx php 404
打开浏览器,输入网址,回车。屏幕上蹦出一个白底黑字的“404 Not Found”,下面一行小字:nginx。你盯着这行字,心里清楚文件明明就在那儿——PHP文件躺在目录里,权限也给了,nginx配置里fastcgi_pass也指向了php-fpm的9000端口。可它就是404。 这事我遇到过不下十次。最离谱的一回,是帮朋友调一个WordPress站点。首页正常,后台wp-admin能进,唯独文章详情页全部404。他信誓旦旦说固定链接没改过,我登服务器一看,nginx的try_files写的是 改法很简单,在location /里面加一段: 另一种常见情况是PATH_INFO模式。比如ThinkPHP或者Laravel配了 权限问题也会伪装成404。nginx的worker进程用户是www-data,PHP文件属主是root,权限640。nginx能读到文件路径,但读不了内容?不对,这种情况通常报403。但有一种例外:如果 还有个小坑: 说个具体排查步骤。先看nginx错误日志, 我自己的习惯是,遇到nginx+php的404,先curl -I看响应头。Server是nginx,没有X-Powered-By,说明请求压根没到PHP。然后去nginx配置里搜try_files和rewrite,八成能揪出元凶。PHP层面的404反而好办,框架路由没匹配上,开debug模式一目了然。 最后提一句,别迷信网上那些“万能nginx配置”。不同框架、不同URL模式、不同PHP版本,配置差异很大。搞懂fastcgi_pass、SCRIPT_FILENAME、try_files这三个东西的协作关系,比复制粘贴一百段配置都管用。404不是bug,是nginx在告诉你:它没找到该找的东西。你得告诉它去哪找。try_files $uri $uri/ =404;。问题就在这。WordPress的伪静态请求走的是index.php,但nginx拿到/2024/01/hello-world/这个URI,先去磁盘找对应目录,找不到,直接甩404,根本没给PHP解释的机会。try_files $uri $uri/ /index.php?$args;。重启nginx,文章页秒开。这个案例说明一个事:nginx的404和PHP的404是两套逻辑。nginx负责静态文件路由,PHP负责动态脚本执行。请求没进到PHP层面,nginx就先判了死刑。index.php/Home/Index/index这种URL。nginx默认不认PATH_INFO,需要显式配置fastcgi_split_path_info。少写这一行,nginx把/index.php/Home/Index/index当成一个不存在的文件路径,404没商量。我见过有人折腾一下午,最后发现是fastcgi_param PATH_INFO $fastcgi_path_info;这行被注释掉了。open_basedir限制了PHP能访问的目录,而nginx把请求转给了php-fpm,php-fpm找不到文件,返回“File not found”,nginx再把这个错误包装成404返回给浏览器。你看到的是nginx的404页面,根子在PHP的open_basedir配置。index index.php index.html;这行指令。如果目录下同时存在index.html和index.php,nginx会优先返回index.html。有人改了PHP代码发现不生效,浏览器一直404或者显示旧页面,其实是index.html在捣乱。删掉它,或者调整顺序,问题消失。tail -f /var/log/nginx/error.log。如果日志里写的是“open() failed (2: No such file or directory)”,那是路径问题。如果写的是“FastCGI sent in stderr: Primary script unknown”,那是php-fpm没找到SCRIPT_FILENAME,检查fastcgi_param那行。如果日志干净,啥也没有,那404可能是nginx的try_files或者rewrite规则直接返回的,跟PHP无关。
-
上一篇
-
下一篇