“Primary script unknown”错误90%因SCRIPT_FILENAME路径不匹配:需在location ~ .php$块中显式添加fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,确保root定义在server级、php-fpm用户有目录读取权限,并注意Windows/WSL/Docker路径一致性。

phpEnv 下 Nginx 报 FastCGI sent in stderr: "Primary script unknown",90% 是 SCRIPT_FILENAME 路径没对上,不是 PHP 没装好、也不是端口不通。
nginx 配置里 SCRIPT_FILENAME 必须指向真实文件路径
phpEnv 默认用 fastcgi_params 文件,但它不包含 SCRIPT_FILENAME —— 这个关键参数得手动补上。否则 nginx 传给 php-fpm 的脚本路径是空或错的,php-fpm 根本找不到 index.php。
- 打开你的 nginx server 块(比如
phpenv/nginx/conf/vhost/your-site.conf) - 在
location ~ \.php$ { ... }块内,确保有这行:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 不要写成
/scripts$fastcgi_script_name或硬编码路径(如/wwwroot/...),$document_root必须由当前server或location的root指令定义出来 - 如果
root写在location /里,但没写在location ~ \.php$里,$document_root在 PHP 块里可能为空——最稳妥是把root提到server级,或显式复制进 PHP location
phpEnv 的 php-fpm 用户权限必须能读取网站目录
phpEnv 启动的 php-fpm 默认用 www 用户,但 Windows 上没有这个用户,Linux/macOS 上若网站目录属主不是 www(或你改过的用户),就会因权限拒绝导致“脚本未知”。
- 查当前 php-fpm 进程用户:
ps aux | grep php-fpm | grep -v grep,看输出里USER列是什么 - 检查网站根目录权限:
ls -ld /path/to/your/webroot,确认该目录可被 php-fpm 用户读取(至少r-x对目录,r--对.php文件) - 修改 php-fpm 用户(以 Linux 为例):
编辑phpenv/php/etc/php-fpm.d/www.conf,改这两行:user = www→ 改成user = your_usernamegroup = www→ 改成group = staff(macOS)或www-data(Ubuntu) - 改完重启:
phpenv stop php-fpm && phpenv start php-fpm
Windows 下路径分隔符和盘符容易出错
phpEnv 在 Windows 上跑时,$document_root 展开后可能是 C:\www\site\,但 php-fpm(尤其旧版)只认正斜杠 /,且对盘符大小写敏感;更麻烦的是,Windows 的 UNC 路径或长路径嵌套会直接让 php-fpm 返回“unknown”。
- 强制统一用正斜杠:
把root C:\www\myapp;改成root /c/www/myapp;(注意是/c/不是C:/) - 避免深层嵌套路径:
别用C:\Users\Name\Documents\phpEnv\www\project\public这种,移到C:\www\project级别 - 如果用了
alias(比如映射/admin到子目录),$document_root不生效,必须显式写死:fastcgi_param SCRIPT_FILENAME /c/www/admin/public$fastcgi_script_name;
Docker 或 WSL 环境要特别注意路径映射一致性
phpEnv 若跑在 WSL 或 Docker 容器里,宿主机路径和容器内路径不一致时,$document_root 在 nginx 看是 /var/www/html,但 php-fpm 实际挂载的是 /mnt/c/www,两者对不上就必然报错。
- 确认 nginx 和 php-fpm 看到的路径完全一致:
在 nginx 配置里写root /var/www/html;,就在 php-fpm 的www.conf里配chroot = /var/www/html(慎用)或确保php_admin_value[doc_root]指向同一位置 - 更简单做法:绕过
$document_root,直接硬编码(仅限调试):fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; - WSL 用户检查是否启用了
metadata:在/etc/wsl.conf加[automount] options = "metadata",否则 chmod 不生效,php-fpm 拒绝读取
最容易被忽略的是:phpEnv 的 nginx 配置模板常把 include fastcgi_params; 放在 fastcgi_param SCRIPT_FILENAME ... 之前,结果后者被覆盖。顺序错了,加了也白加。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











