PHP本身不创建虚拟目录,Windows下“PHP虚拟目录”实为Web服务器(IIS/Apache/Nginx)对URL路径与物理目录的映射配置;IIS需手动添加FastCGI映射、设权限及php.ini关键参数;Apache用Alias配合Directory授权;Nginx须严格配alias+root+SCRIPT_FILENAME;符号链接可作进阶替代方案。

PHP 本身不创建虚拟目录,Windows 下的“PHP 虚拟目录”其实是 IIS(或 Apache/Nginx)对 URL 路径与物理目录之间的映射配置。关键不是 PHP 做了什么,而是 Web 服务器是否把请求正确转给 PHP 解释器,并让 PHP 有权限读取对应文件。
一、IIS 环境:最常见也最容易出错
在 Windows + IIS 中,新建虚拟目录后,默认不会执行 .php 文件——它只会下载、报 404 或返回空白页。必须手动补全三件事:
-
添加 FastCGI 处理程序映射:右键该虚拟目录 → “处理程序映射” → “添加模块映射”,填入:
• 请求路径:*.php
• 模块:FastCgiModule(务必从下拉菜单选,手输无效)
• 可执行文件:C:\php\php-cgi.exe(路径必须准确,不能是 php.exe)
• 名称:建议带后缀如PHP_via_FastCGI_myapp,避免和根站点冲突
• 勾选“仅限脚本”和“验证文件是否存在” -
设置物理路径权限:给虚拟目录真实存放路径(比如
D:\myproject)授予IIS_IUSRS和IUSR用户的“读取 & 执行”权限 -
确认 php.ini 关键项:
•fastcgi.impersonate = 1(启用身份模拟,否则 PHP 无法访问非根目录)
•cgi.fix_pathinfo = 1(尤其在带子路径访问时,如/myapp/index.php/test)
•extension_dir = "C:/php/ext"(用正斜杠或双反斜杠,避免路径解析失败)
二、Apache 环境:靠 Alias 指令实现
Apache 不需要为每个虚拟目录单独配 PHP 映射,只要主站已支持 PHP,Alias 就能复用。操作分两步:
-
在站点配置中加 Alias(例如 httpd-vhosts.conf 或 httpd.conf):
Alias /myapp "D:/myproject/public"<br><Directory "D:/myproject/public"><br> Require all granted<br></Directory>
-
确保 DocumentRoot 下的 .htaccess 或主配置允许重写(尤其 Laravel/ThinkPHP 等框架):
• 开启mod_rewrite
• 在<directory></directory>块中加入AllowOverride All
• 若用 Apache 2.4+,Require all granted必须存在,替代旧版Order Allow,Deny
三、Nginx 环境:alias + root + SCRIPT_FILENAME 缺一不可
Windows 下 Nginx 配虚拟目录极易 404 或 502,问题多出在 SCRIPT_FILENAME 构造错误。正确写法示例(虚拟目录 /admin 指向 E:/WWW/admin):
立即学习“PHP免费学习笔记(深入)”;
location /admin {<br> alias E:/WWW/admin/;<br> index index.php;<br> location ~ \.php$ {<br> fastcgi_pass 127.0.0.1:9000;<br> fastcgi_index index.php;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> include fastcgi_params;<br> }<br>}
注意:alias 结尾必须带 /;location 路径末尾不加 /(即写 /admin,不是 /admin/);$document_root 必须指向主站点 root,不能依赖 alias 自动替换。
四、进阶技巧:用符号链接(symlink)替代传统虚拟目录
适合多项目共享代码、快速切换版本的场景。前提:开启开发者模式或组策略允许创建符号链接。
- 管理员 CMD 运行:
mklink /D "C:\inetpub\wwwroot\myapp" "D:\projects\myapp" - IIS 中添加虚拟目录,物理路径填链接路径(
C:\inetpub\wwwroot\myapp) - 右键该虚拟目录 → “转换为应用程序”,并确保应用池用户(如
IIS AppPool\DefaultAppPool)对真实路径(D:\projects\myapp)有读取+执行权限 - 若框架需向上加载 vendor/autoload.php,还需在该应用程序“高级设置”中将“启用父路径”设为
True



















