PHP本身不创建虚拟目录,虚拟目录是Web服务器(如IIS、Apache、Nginx)的配置功能,需通过服务器将URL路径映射到物理路径,并显式配置PHP处理程序(如IIS中绑定FastCgiModule)、权限及重写规则,才能使.php文件正常执行。

PHP 本身不创建虚拟目录,虚拟目录是 Web 服务器(如 IIS、Apache、Nginx)的配置功能。所谓“PHP 创建虚拟目录”,实质是让 Web 服务器将某个 URL 路径(如 /soft)映射到一个物理路径(如 D:\myapp),并确保该路径下的 .php 文件能被正确解析执行——这依赖于服务器对 PHP 的处理程序配置,而非 PHP 自身逻辑。
请求流转关键四步
以 IIS + PHP 8.0.30 为例,一次 GET /soft/index.php 请求的实际路径如下:
-
客户端发起请求:浏览器访问
http://localhost/soft/index.php -
IIS 路由解析:IIS 根据站点绑定和虚拟目录配置,将
/soft映射到物理路径D:\myapp;此时请求路径变为D:\myapp\index.php -
处理程序匹配:IIS 检查当前作用域(此处是虚拟目录节点)是否注册了
*.php的 FastCgiModule 映射;若未配置,IIS 默认按静态文件处理,导致下载或 404 -
PHP 执行与返回:匹配成功后,IIS 启动
php-cgi.exe进程,传入脚本路径与环境变量;PHP 解析执行index.php,输出结果经 IIS 返回浏览器
为什么虚拟目录常“不执行 PHP”?
根本卡点不在 PHP 版本或代码,而在 IIS 的作用域隔离机制:
- 虚拟目录是独立配置节点,不自动继承根站点的处理程序映射;即使主站已配好
PHP_via_FastCGI,虚拟目录下仍为空白 - FastCGI 模块需显式绑定到该节点,且“模块”必须从下拉菜单选
FastCgiModule(手输无效) - 物理路径权限缺失时,
php-cgi.exe无法读取文件,直接报 500 错误;必须赋予IIS_IUSRS和IUSR“读取 & 执行”权限
框架类应用额外依赖重写规则
ThinkPHP、Laravel 等依赖 PATH_INFO 的框架,在虚拟目录中会因 IIS 默认路由行为失败,典型报错:No input file specified 或 404。
原因在于 IIS 不会自动把 /soft/admin/user/list 转给 /soft/index.php 处理。必须在虚拟目录根下放 Web.config,补全 URL 重写逻辑:
- 规则需将
/soft/xxx重写为/soft/index.php?/xxx(注意问号不可省) - 必须设置
stopProcessing="true",防止被后续默认规则覆盖 - 该配置仅对当前虚拟目录生效,不作用于父站点或其他目录
对比其他服务器:Apache/Nginx 更简洁
Apache 使用 Alias + 即可完成映射与权限控制;Nginx 用 location /vdir { alias /path; } 一行搞定。它们对 PHP 的调用(如通过 php-fpm)通常由全局配置统一管理,无需为每个虚拟路径重复绑定处理器——而 IIS 的模块映射是逐节点配置的,这是 Windows 环境下最易忽略的设计差异。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











