nginx 1.24.0 不支持传统 apache 风格的 alias 式 php 虚拟目录,因 alias 替换路径后 $fastcgi_script_name 仍保留原始 uri,导致 script_filename 拼出错误路径(如 d:/www/myapp/phpapp/index.php),引发“file not found”或“primary script unknown”错误;正确做法是用 location ^~ /phpapp/ + alias d:/www/myapp/ + fastcgi_param script_filename $request_filename,并确保权限、php.ini 设置(cgi.force_redirect=0、fastcgi.impersonate=1)及 php-fpm 监听正常。

直接说结论:Nginx 1.24.0 不支持传统 Apache 风格的 Alias 式 PHP 虚拟目录(如 /admin 指向另一套 PHP 程序),必须靠 location 块 + 独立 root 或 alias + 正确的 SCRIPT_FILENAME 构建,且 PHP 脚本入口路径必须能被真实解析。
为什么不能直接用 alias /phpapp /D:/www/myapp;
因为 alias 会替换匹配路径,但 $fastcgi_script_name 仍含原始 URI,导致 SCRIPT_FILENAME 拼出错误路径。例如请求 /phpapp/index.php,alias 把 /phpapp/ 替换为 D:/www/myapp/,但 $fastcgi_script_name 还是 /phpapp/index.php,拼出来就是 D:/www/myapp/phpapp/index.php —— 显然不存在。
常见报错:File not found. 或 Primary script unknown。
正确做法是:
- 用
location ^~ /phpapp/精确前缀匹配,避免正则干扰 - 用
alias D:/www/myapp/;(末尾必须有/) -
SCRIPT_FILENAME必须用$request_filename,而不是$document_root$fastcgi_script_name - 确保该目录下有可执行的
index.php,且 PHP 进程监听正常
location + alias + $request_filename 的最小可行配置
在 server 块内添加:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
location ^~ /phpapp/ {
alias D:/www/myapp/;
index index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
}
}
说明:
-
^~保证前缀匹配优先级高于正则,防止被其他location ~ \.php$拦截 -
alias后路径末尾斜杠不能省,否则映射会错位 -
$request_filename是 Nginx 内部解析出的真实磁盘路径,绕过$document_root和$fastcgi_script_name的拼接陷阱 - 不要在该
location外再写全局location ~ \.php$,否则会冲突
如果想复用同一 PHP-FPM 进程但隔离运行环境
更稳妥的方式是不用 alias,改用独立 root + rewrite(仅限无重写逻辑的简单场景)或直接配多个 server:
- 对单站点多子应用,推荐为每个虚拟目录起一个
location,各自设root并显式指定入口,例如:root D:/www/myapp;+fastcgi_param SCRIPT_FILENAME $realpath_root/index.php; - 若需完整隔离(不同 php.ini、扩展、用户权限),应启动多个
php-cgi.exe实例,监听不同端口(如9001,9002),再在对应location中指向不同fastcgi_pass -
fastcgi_param PHP_ADMIN_VALUE "open_basedir=D:/www/myapp/:/tmp/"可加在location内限制脚本访问范围,防跨目录读取
Windows 下容易忽略的权限与路径细节
Nginx 和 PHP-CGI 在 Windows 上默认以当前用户(如你登录账户)运行,但若用服务方式启动,可能以 SYSTEM 或 LocalService 身份运行 —— 这会导致无法访问你个人目录下的 PHP 文件。
务必确认:
- PHP 应用目录(如
D:/www/myapp)对运行 Nginx 的用户有读取+执行权限 - 路径中避免中文、空格、括号;尽量用短路径名(如
D:/w/myapp)减少转义问题 -
php.ini中cgi.force_redirect = 0和fastcgi.impersonate = 1必须启用,否则 Windows 下 FastCGI 调用失败 - 测试时先访问静态文件(如
/phpapp/test.txt),确认alias或root映射正确,再测 PHP
最常卡住的地方不是配置语法,而是 SCRIPT_FILENAME 拼出来的路径根本不存在,或者存在但 Nginx 进程没权限打开 —— 务必查 error.log 里那句 FastCGI sent in stderr: "Primary script unknown" 后面的真实路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










