必须用$document_root$fastcgi_script_name拼接SCRIPT_FILENAME,因alias不自动修正路径,配合php.ini中cgi.fix_pathinfo=1和cgi.force_redirect=0才可正确解析虚拟目录下PHP脚本。

Windows 下用 Nginx 配 PHP 虚拟目录(比如 /admin、/api)时,fastcgi_param SCRIPT_FILENAME 的写法非常关键——配错就会 404 或 502,报错 “Primary script unknown”。核心不是靠 alias 自动推导路径,而是必须手动拼出 PHP 文件的**完整绝对路径**。
必须用 $document_root$fastcgi_script_name
在虚拟目录的 location 块里,不能写成 $request_filename 或 $realpath_root$fastcgi_script_name,也不能直接硬编码路径。正确且稳定的方式是:
-
显式声明
root指向主站点根目录(如E:/WWW) -
用
alias指向虚拟目录物理路径(如E:/WWW/admin/),注意结尾带斜杠 SCRIPT_FILENAME必须写为:$document_root$fastcgi_script_name
这是因为 $document_root 在 alias 场景下会被 Nginx 自动替换为 alias 所指的物理路径,而 $fastcgi_script_name 是请求中解析出的脚本路径(如 /admin/index.php),两者拼起来才是 PHP-CGI 能识别的绝对路径。
为什么不能用 $request_filename
$request_filename 是 Nginx 内部根据 root 或 alias 计算出的文件系统路径,看似合理,但在 Windows + alias + PHP 组合下常出问题:
- 当 location 是
/admin,请求/admin/index.php时,$request_filename可能变成E:/WWW/admin//index.php(多一个斜杠) - PHP 解析时对路径敏感,双斜杠或大小写不一致都可能导致 “File not found”
-
$document_root$fastcgi_script_name更可控,避免中间环节干扰
配套必须检查的两项
光写对 SCRIPT_FILENAME 不够,下面两个条件缺一不可:
-
php.ini 中
cgi.fix_pathinfo=1—— 否则 PHP 无法从/admin/index.php正确提取真实脚本位置,会只查当前目录下的index.php -
cgi.force_redirect=0—— 若为 1,所有非文档根下的请求都会被拦截返回 404
改完 php.ini 后,务必重启 php-cgi.exe 进程(或整个 PHP 服务),否则不生效。
典型配置片段参考
以虚拟目录 /admin 映射到 E:/WWW/admin/ 为例:
location /admin {
alias E:/WWW/admin/;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注意:location /admin 不要写成 /admin/,否则 $fastcgi_script_name 会多出前导斜杠,导致拼接错误。











