phalcon应用nginx下404的根本原因是请求未进入php层,修复需两步:一是nginx root精确指向public目录,二是配置try_files规则并确保path_info正确传递。

Phalcon 应用在 Nginx 下出现路由 404,根本原因不是 Phalcon 路由没写对,而是请求压根没进到 Phalcon 的 PHP 层——Nginx 直接返回了 404,跳过了 public/index.php 入口。修复核心就两点:确保所有非静态资源请求都转发给入口文件,并让 Nginx 正确识别并传递 PATH_INFO 或 QUERY_STRING。
确认 Nginx root 指向 public 目录
Phalcon 推荐标准结构是 project/public/index.php 为唯一 Web 入口。Nginx 的 root 必须精确指向 public 子目录,不能是项目根目录。
- 在宝塔面板【网站】→【设置】→【网站目录】中,检查【运行目录】是否为
/public(相对路径)或完整绝对路径如/www/wwwroot/myapp/public - 若 root 设为
/www/wwwroot/myapp,Nginx 就会尝试找/www/wwwroot/myapp/index.php,而该文件实际在public/下,必然 404 - 修改后务必点击【保存】,再对站点执行【重启】
配置兼容 Phalcon 的伪静态规则(推荐 try_files)
Phalcon 默认使用 PATH_INFO 模式(如 /index/index),Nginx 需将请求交由 index.php 并保留原始路径。官方推荐且最稳定的写法是 try_files,避免 if 带来的潜在问题。
- 进入站点 Nginx 配置文件(如
/www/server/panel/vhost/nginx/your-site.conf) - 在
server块内、location ~ \.php$之前添加:
try_files $uri $uri/ /index.php?$query_string;
}
- 注意:此处用的是
/index.php(不是/public/index.php),因为 root 已设为 public 目录,所以/index.php对应的就是public/index.php - 保存后执行
nginx -t测试语法,再nginx -s reload重载
验证 PHP-FPM 是否正确传递 PATH_INFO
Phalcon 依赖 $_SERVER['PATH_INFO'] 解析路由。若该变量为空,所有路由都会匹配失败,表现为首页能打开但其他路径 404。
- 检查 PHP 处理块(通常在
location ~ \.php$内)是否包含以下两行:
fastcgi_param PATH_INFO $fastcgi_path_info;
- 其中
$fastcgi_path_info来自 Nginx 内置变量,需确保 location 匹配规则支持提取(location ~ [^/]$\.php(/|$)更稳妥,但标准location ~ \.php$通常已足够) - 可临时在
public/index.php开头加var_dump($_SERVER['PATH_INFO'] ?? 'MISSING');验证
排除静态资源被错误拦截
如果 CSS、JS、图片也 404,说明 try_files 规则未生效,或有更高优先级的 location 拦截了请求。
- 检查配置中是否有类似
location ~* \.(js|css|png|jpg|gif)$的块,且内部缺少try_files $uri =404;或未设置expires后直接return 404 - 确保没有
location /public/这类冗余定义干扰主location / - 用
curl -I http://yoursite.com/css/app.css看响应状态码,确认静态资源是否真缺失,还是被路由误处理











