IIS中创建虚拟目录后PHP不执行、静态资源404或.php被下载,根本原因是未手动继承FastCGI映射、权限不足(需授予IIS_IUSRS和IUSR读取/执行权限)、物理路径含中文/空格,或未配置Web.config重写规则;关键须在虚拟目录节点下添加*.php到FastCgiModule的模块映射,并设cgi.fix_pathinfo=1。

在 IIS 中创建虚拟目录本身很简单,关键在于后续配置是否到位——多数人建完发现 PHP 不执行、静态资源 404 或直接下载 .php 文件,问题几乎都出在权限、处理程序映射或路径设置上。
基础创建步骤
打开「Internet 信息服务(IIS)管理器」→ 展开目标网站(如 Default Web Site)→ 右键点击网站 → 选择「添加虚拟目录」→ 按向导操作:
-
别名:输入 URL 中要显示的名称(如 api、admin),用户访问时用
http://localhost/api/ -
物理路径:浏览并选中本地或远程文件夹(如
D:myapp或\servershare) - 连接为:若路径在本地且权限已设好,可保持默认;若指向远程 UNC 路径,需填入有读取权限的域账户
- 权限设置:勾选「读取」和「运行脚本」(PHP 必须勾选此项),按需选「写入」
PHP 项目必须补的关键配置
仅创建虚拟目录,PHP 文件不会自动执行。IIS 默认不继承父站点的 .php 映射规则,必须手动绑定 FastCGI 处理程序:
- 在 IIS 管理器中,选中刚建好的虚拟目录节点(不是根站点)
- 双击「处理程序映射」→ 右侧点击「添加模块映射…」
- 填写:
- 请求路径:
*.php - 模块:从下拉菜单选 FastCgiModule(手输无效)
- 可执行文件:
C:phpphp-cgi.exe(路径必须与主站一致) - 名称:
PHP_via_FastCGI_in_[别名](避免与根目录同名) - 勾选「仅限脚本」和「验证文件是否存在」
- 请求路径:
权限与路径注意事项
即使映射正确,没权限或路径不规范也会失败:
- 物理路径不能含中文、空格或特殊符号(推荐全英文路径,如
D:phpapp) - 对物理文件夹右键 → 「属性」→ 「安全」→ 添加用户
IIS_IUSRS和IUSR,赋予「读取 & 执行」、「列出文件夹内容」、「读取」 - 若用 ThinkPHP、Laravel 等框架,还需在虚拟目录根下放一个
Web.config,包含 PATH_INFO 重写规则,否则路由全 404 - 确保
php.ini中cgi.fix_pathinfo = 1(IIS 场景下建议设为 1,避免/index.php/xxx类 URL 报错)
更稳妥的做法:转为应用程序
如果虚拟目录用于独立 PHP 项目,推荐右键该目录 → 「转换为应用程序」:
- 可指定独立的应用程序池(建议复用主站池,但确认其「启用 32 位应用程序」与 PHP 架构一致)
- 「.NET CLR 版本」设为「无托管代码」
- 应用程序模式比普通虚拟目录拥有更完整的处理链,减少映射遗漏风险

















