“primary script unknown”错误90%因script_filename未显式配置:需在location ~ .php$块中,于include fastcgi_params;之后添加fastcgi_param script_filename $document_root$fastcgi_script_name;,并确保root定义在server级且php-fpm用户有读取权限。

“Primary script unknown”不是 PHP 挂了,90% 是 fastcgi_param SCRIPT_FILENAME 没配对 —— 路径错、顺序错、变量空,三者占绝大多数。
SCRIPT_FILENAME 必须显式设置,不能依赖 fastcgi_params
nginx 自带的 fastcgi_params 文件(尤其在较新版本或 phpEnv 等集成环境)默认不包含 SCRIPT_FILENAME。它只负责传基础参数,而这个最关键路径参数得你亲手补上。
- 错误写法:
include fastcgi_params;后没跟fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 正确位置:必须放在
include fastcgi_params;之后(否则会被覆盖),且在location ~ \.php$ { ... }块内 - 绝对不要硬编码路径,比如
/wwwroot/index.php或/scripts$fastcgi_script_name—— 这会导致跨环境失效 - 确保
$document_root有值:它依赖root指令,而该指令最好定义在server级,而非仅在location /里
fastcgi_param 加载顺序直接影响 SCRIPT_FILENAME 是否生效
nginx 按配置文件中出现顺序覆盖同名 fastcgi_param,include fastcgi_params; 本质是批量插入一堆 fastcgi_param 行 —— 如果它出现在你自定义的 SCRIPT_FILENAME 之后,你的设置就会被清空。
- 危险顺序:
fastcgi_param SCRIPT_FILENAME ...; include fastcgi_params;→ 你的值被覆盖 - 安全顺序:
include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;→ 你的值最终生效 - 验证方法:在 nginx 配置中加一行
error_log /var/log/nginx/php-debug.log notice;,然后nginx -t && nginx -s reload,再访问 .php 触发日志,检查是否还有 “Primary script unknown”
PATH_INFO 和 try_files 共存时容易误判脚本存在性
当配置了 try_files $uri =404; 或 fastcgi_split_path_info,而 $document_root 指向的是 public 目录,但请求 URI 是 /index.php/some/path,Nginx 可能先用 $uri(即 /index.php/some/path)去磁盘找文件,结果找不到就直接 404,根本没走到 PHP-FPM。
- 典型症状:访问
/index.php正常,但/index.php/test返回 404 - 解决关键:把
try_files改成try_files $fastcgi_script_name =404;,或干脆删掉 —— 让 PHP 框架自己处理路由 - 如果必须保留
try_files,请确认$document_root下真实存在你请求的.php文件,且路径与$fastcgi_script_name输出一致(可用echo $fastcgi_script_name;在 PHP 中调试) -
fastcgi_split_path_info正则若不匹配(如写成^(.+\.php)(/.+)$却请求/index.php无 PATH_INFO),会导致$fastcgi_path_info为空,但通常不影响SCRIPT_FILENAME,除非你后续依赖它构造路径
权限和路径一致性常被忽略,但一出问题就卡死
即使 SCRIPT_FILENAME 路径完全正确,php-fpm 进程仍可能因权限或路径解析失败而报 “Primary script unknown”。
- Windows/WSL/Docker 下注意路径分隔符和大小写:
$document_root若为C:/www,而实际文件在c:/www,Windows 不敏感但 WSL 可能敏感;Docker volume 挂载路径需与root完全一致 - php-fpm 用户必须对
$document_root目录有r-x权限(目录可进入),对.php文件有r--权限(文件可读) - 查 php-fpm 用户:
ps aux | grep php-fpm | grep -v grep,看 USER 列;再查目录属主:ls -ld /path/to/webroot - 临时测试可改 php-fpm 用户为当前登录用户(如 Linux 上
user = yourname),避免权限干扰 —— 但上线前务必改回最小权限模型
最麻烦的不是配错哪一行,而是多个环节都看似正常:路径对了、顺序对了、权限也开了,但 $document_root 实际由 upstream 或 rewrite 动态生成,导致运行时为空 —— 这时候得用 log_format 把 $document_root 和 $fastcgi_script_name 打进 access log,眼见为实。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











