IIS 10 必须启用 CGI 功能,因为 FastCGI 模块依赖系统级 CGI 支持组件;未启用时,“FastCGI 设置”节点不显示、FastCgiModule 不可用,导致 .php 请求返回 500.19 或 404 错误。

必须用 Non Thread Safe(NTS)版本的 PHP 8.1,且 IIS 的 CGI 功能必须提前启用,否则 php-cgi.exe 根本无法被加载或响应请求。
为什么 IIS 10 必须启用 CGI 功能才能运行 PHP
FastCGI 是独立于 IIS 工作进程的外部进程模型,它依赖 Windows 系统级的 CGI 支持组件。如果没开 CGI,IIS 管理器里压根不会显示“FastCGI 设置”节点,FastCgiModule 也会处于不可用状态 —— 此时即使手动添加处理程序映射,访问 .php 文件只会返回 500.19 错误或直接 404。
启用方式(管理员权限):
- 打开“控制面板 → 程序与功能 → 启用或关闭 Windows 功能”
- 展开“Internet Information Services → Web 管理工具 → IIS 管理控制台”,确保勾选
- 展开“Internet Information Services → 应用程序开发功能”,**必须勾选“CGI”**(不是“ASP”或“ISAPI”)
- 点击确定,等待安装完成,重启 IIS(
iisreset /restart)
PHP 8.1 安装路径与 fastcgi.impersonate 配置要点
下载地址是 https://windows.php.net/download/,务必选中带 Non Thread Safe 和对应架构(如 VS16 x64 NTS)的 ZIP 包,解压到无空格、无中文的路径,例如 C:\php-8.1.26-nts。
立即学习“PHP免费学习笔记(深入)”;
关键配置在 php.ini(由 php.ini-development 复制重命名而来):
-
fastcgi.impersonate = 1—— 必须开启,否则 PHP 脚本以 ApplicationPoolIdentity 运行,无法读取网站目录下用户上传的文件或写 session -
cgi.force_redirect = 0—— FastCGI 模式下必须关闭重定向,否则所有请求会 502 -
extension_dir = "ext"或绝对路径如extension_dir = "C:\php-8.1.26-nts\ext" -
date.timezone = Asia/Shanghai—— 避免PHP Warning: Unknown: It is not safe to rely on the system's timezone settings - 临时目录需显式设置且赋予
IIS_IUSRS写权限:upload_tmp_dir = C:\Windows\Temp、session.save_path = C:\Windows\Temp
FastCGI 设置与处理程序映射的精确参数
这两步必须严格匹配,否则会出现 500.0、500.19 或空白响应:
- 在 IIS 管理器服务器节点 → “FastCGI 设置” → “添加应用程序”
-
完整路径填:C:\php-8.1.26-nts\php-cgi.exe - “常规”选项卡中:
监视对文件所做的更改设为C:\php-8.1.26-nts\php.ini;活动状态时间限制建议设为300(避免长请求被杀) - 网站节点 → “处理程序映射” → “添加模块映射”
-
请求路径:*.php -
模块:FastCgiModule(注意拼写,不是 FastCGIModule) -
可执行文件:和上面完全一致,即C:\php-8.1.26-nts\php-cgi.exe -
名称:建议填PHP_via_FastCGI,便于识别 - 务必勾选
仅限脚本(否则可能触发安全警告或拒绝服务)
测试失败时最该检查的三处地方
很多配置看似完成,但 info.php 打不开,常见卡点就这三处:
-
php-cgi.exe -i在命令行执行是否输出 phpinfo?如果报错“找不到 VCRUNTIME140.dll”,说明缺少 Visual C++ 2015–2022 运行库,需安装vc_redist.x64.exe - IIS 应用程序池的 .NET CLR 版本必须设为
无托管代码(不是 v4.0 或 v2.0),否则 FastCGI 启动失败 - PHP 安装目录(如
C:\php-8.1.26-nts)和网站物理路径,都必须给IIS_IUSRS用户至少“读取 & 执行”权限;若用session或上传,还需“写入”权限
真正容易被忽略的是权限继承问题:即使你给网站根目录加了 IIS_IUSRS 权限,PHP 安装目录默认是拒绝继承的,必须手动右键属性 → 安全 → 编辑 → 添加并勾选权限。这点不处理,500.19 错误会一直卡在“无法读取配置文件”上。



















