PHP 8.1 在 Windows 11 的 IIS 虚拟目录中不执行,根本原因是处理程序映射未继承或缺失:虚拟目录默认不自动继承父网站的 .php 映射规则,需手动添加 FastCGI 模块映射或将其转换为应用程序,并确保 fastcgi.impersonate = 1、正确设置 extension_dir 路径及物理目录权限。

PHP 8.1 在 Windows 11 的 IIS 上不能直接“创建 PHP 虚拟目录”——虚拟目录本身不区分语言,但要让它正确执行 PHP 脚本,必须确保该虚拟目录继承或显式获得 PHP 处理能力。否则访问 .php 文件只会下载、报 404 或显示空白。
为什么虚拟目录里 PHP 文件不执行?
根本原因是:IIS 的处理程序映射(Handler Mappings)默认只作用于网站根节点或显式继承的子节点。新建的虚拟目录默认不自动继承父网站的 .php 映射规则,尤其当它被添加在非默认网站下,或父网站未启用 CGI/FastCGI 时,php-cgi.exe 根本不会被调用。
- 常见现象:浏览器打开
http://localhost/soft/index.php,返回空白页、下载文件、或 404/500 错误 - 检查点:在 IIS 管理器中选中该虚拟目录 → 双击“处理程序映射”,看列表里是否有名为
PHP_via_FastCGI或类似名称的条目 - 关键区别:虚拟目录 ≠ 应用程序。只有标记为“应用程序”的虚拟目录才能拥有独立的应用程序池和完整处理链;普通虚拟目录依赖上级配置
如何让虚拟目录支持 PHP 8.1?
有两种可靠方式,按优先级推荐:
-
方式一(推荐):把虚拟目录转成应用程序
右键点击虚拟目录(如soft)→ “转换为应用程序” → 应用程序池可沿用父网站的(如DefaultAppPool),但必须确保该池已启用 32 位支持(若 PHP 8.1 是 x86 版)且 .NET CLR 版本设为“无托管代码” -
方式二:手动继承处理程序映射
选中虚拟目录 → 双击“处理程序映射” → 点击右侧“添加模块映射” → 填写:
• 请求路径:*.php
• 模块:FastCgiModule
• 可执行文件:C:phpphp-cgi.exe(路径需与你实际安装一致)
• 名称:PHP_via_FastCGI_in_soft(避免重名) - 无论哪种方式,都要确认 FastCGI 设置已存在:
服务器节点 → “FastCGI 设置” → 查看是否已有C:phpphp-cgi.exe条目;没有则需先添加
PHP 8.1 配置容易漏掉的关键项
即使映射成功,PHP 8.1 在 IIS 下仍可能因以下配置缺失而失败:
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi.impersonate = 1必须开启(在php.ini中),否则 PHP 进程无法以 IIS 工作进程身份读取虚拟目录物理路径下的文件,导致Permission denied -
extension_dir路径必须用正斜杠或双反斜杠,例如:extension_dir = "C:/php/ext"或extension_dir = "C:\php\ext";单反斜杠会解析失败 - IIS 应用程序池的“标识”用户(如
IIS AppPoolDefaultAppPool)必须对虚拟目录物理路径有读取 & 执行权限(右键文件夹 → “安全” → 添加该用户并勾选) - PHP 8.1 默认禁用
short_open_tag,如果旧代码含... ?>,需手动设为On;但更建议改用<?php
测试前务必检查的三件事
别急着写 phpinfo(),先确认基础链路通了:
- 在虚拟目录物理路径下放一个纯 HTML 文件(如
test.html),访问/soft/test.html—— 若打不开,说明虚拟目录路径或权限有问题 - 确认
php-cgi.exe能在命令行运行:C:phpphp-cgi.exe -v应输出 PHP 8.1 版本;若报“缺少 VCRUNTIME140.dll”等,需安装对应版本的 Visual C++ Redistributable - 检查 IIS 日志(
%SystemDrive%inetpublogsLogFilesW3SVC1)中对应时间戳的条目,HTTP 状态码是 500 还是 404,能快速定位是权限、映射还是 PHP 解析层问题
最常被忽略的是:虚拟目录的物理路径权限没给到应用池标识用户,以及 fastcgi.impersonate = 1 没开。这两项不满足,哪怕映射全对,PHP 脚本也读不到自己的文件。


















