Nginx 本身不支持类似 Apache 的 Alias 或 PHP 虚拟目录概念;所谓“PHP 虚拟目录”需通过 location + alias 配合 PHP-FPM 实现,且必须严格匹配斜杠、显式传递 SCRIPT_FILENAME,并注意 Windows 权限与命名管道配置。

PHP 虚拟目录在 Nginx 中实际不存在
直接说结论:Nginx 本身不支持类似 Apache 的 Alias 或 PHP 虚拟目录概念。所谓“PHP 虚拟目录”,本质是 URL 路径映射到非文档根目录下的物理路径,需靠 Nginx 的 location + alias(或 root)配合 PHP-FPM 实现,且必须注意路径拼接规则。
用 alias 配置非根路径的 PHP 执行点
这是最常见需求场景——比如想让 /admin 访问 D:/www/backend/admin/ 下的 PHP 文件。关键陷阱在于:alias 会**完全替换匹配的 URI 前缀**,而 root 是拼接路径。
- 错误写法(用
root):location /admin { root D:/www/backend; }→ 请求/admin/index.php会找D:/www/backend/admin/index.php,多了一层/admin - 正确写法(用
alias):location /admin/ { alias D:/www/backend/admin/; }→ 注意结尾斜杠必须一致,且alias值末尾也要有斜杠 - PHP-FPM 必须显式传参:
fastcgi_param SCRIPT_FILENAME $request_filename;,不能用$document_root$fastcgi_script_name(因为$document_root在alias下不生效)
Windows 路径与权限的典型坑
PHP-FPM 进程在 Windows 上默认以 SYSTEM 或配置的用户身份运行,但 Nginx 主进程和工作进程权限可能受限,导致文件不可读。
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
- 路径中避免中文、空格、括号;全部使用正斜杠
/或双反斜杠\,例如D:/www/backend/admin/或D:\www\backend\admin\ - 确认 PHP-FPM 能读取目标目录:在命令行用
php -f D:/www/backend/admin/info.php测试是否报错 - Nginx 配置里
fastcgi_pass必须指向正确的 PHP-FPM 地址(如127.0.0.1:9000或命名管道\.pipephp-cgi),Windows 下命名管道更稳定
PHP7.4.33 下 SCRIPT_NAME 和 PHP_SELF 错乱问题
用 alias 后,$_SERVER['SCRIPT_NAME'] 默认仍返回原始 URL 路径(如 /admin/index.php),但 PHP 实际执行的是别名路径下的文件。这会导致框架路由、生成 URL 等逻辑出错。
立即学习“PHP免费学习笔记(深入)”;
- 必须手动修正:
fastcgi_param SCRIPT_NAME $fastcgi_script_name;(而不是$script_name) - 如果用了重写(如 Laravel 的
try_files $uri $uri/ /index.php?$query_string),要确保location ~ .php$块能捕获到/admin/*.php请求,建议把 PHP 处理块放在location /admin/内部,而非全局 - 测试时用
var_dump($_SERVER['SCRIPT_NAME'], $_SERVER['PHP_SELF']);确认值是否符合预期
最易被忽略的是 alias 末尾斜杠与 location 匹配路径的严格对应,差一个斜杠就 404;还有 Windows 下命名管道的配置遗漏,导致 PHP-FPM 根本不响应。这些地方不报明显错误,只静默失败。


















