必须启用iis的cgi功能并安装fastcgimodule,否则fastcgi映射不生效,导致php文件被下载或返回404/500错误;需确认“应用程序开发→cgi”已勾选、php-cgi.exe路径正确、php.ini中cgi.force_redirect=0等关键配置已设。

PHP 文件在 IIS 里直接下载或报 404/500,不是代码问题,而是 FastCGI 映射根本没生效。
FastCgiModule 模块未启用或缺失
这是最常被忽略的底层前提。IIS 默认不启用 FastCGI 支持,哪怕你装了 PHP、配了 php-cgi.exe,FastCgiModule 没装或没勾选,请求就根本进不了 PHP 解析器。
- 打开「服务器管理器 → 添加角色和功能 → Web 服务器(IIS)→ 角色服务」,确认勾选了「应用程序开发 → CGI」
- 若已安装但映射失败,检查 IIS 管理器左侧「连接」树中「模块」列表里是否存在
FastCgiModule;没有则需重新运行角色安装 - IIS 7.5 及更早版本(如 Win Server 2008 R2)可能需手动注册:命令行执行
%windir%\system32\inetsrv\appcmd.exe install module /name:FastCgiModule /image:%windir%\system32\inetsrv\fastcgi.dll
处理程序映射路径或扩展名写错
映射配置看似简单,但 php-cgi.exe 路径、请求路径、内容类型三者任意一个出错,都会导致 404 或 500。
-
请求路径必须是*.php(注意星号和点,不能写成.php或*.php5) -
可执行文件必须指向具体php-cgi.exe的绝对路径,例如C:\php\php-cgi.exe;不能是php.exe(那是 CLI 模式) -
请求限制 → 内容类型建议留空,或设为application/x-httpd-php;若填错(如漏掉x-),IIS 会拒绝转发 - 映射名称建议用
PHP_via_FastCGI这类明确标识,避免与旧映射冲突
php.ini 中关键 CGI 相关设置被禁用
即使 FastCGI 映射通了,PHP 自身也可能拒绝响应。常见于 php.ini 里几个强制性开关被关掉。
-
cgi.force_redirect = 0—— IIS 不走重定向,必须关掉,否则返回 502 -
fastcgi.impersonate = 1—— 让 PHP 以当前请求用户身份运行,权限才对得上 -
cgi.fix_pathinfo = 0—— 关闭后可防止路径解析漏洞,也避免某些 404 - 检查
extension_dir是否指向真实ext目录,路径错误会导致扩展加载失败,进而触发 500
IIS_IUSRS 权限缺失或 php-cgi.exe 被系统拦截
权限问题往往表现为 500 错误且无日志,或双击 php-cgi.exe 提示 DLL 缺失。
- 给 PHP 安装目录(含
php-cgi.exe和ext子目录)赋予IIS_IUSRS用户组「读取 & 执行」权限 - 确保 Windows 已安装对应 VC++ 运行库:PHP 7.4+ 需
vc_redist.x64.exe(2015–2022),缺一个 DLL(如api-ms-win-crt-stdio-l1-1-0.dll)就会进程退出 - 临时关闭杀毒软件或 Windows Defender 实时防护,它们有时会拦截
php-cgi.exe创建子进程
真正卡住的点往往不在 PHP 代码本身,而在 IIS 和 PHP 之间的那层「握手协议」——FastCgiModule 是否存在、php-cgi.exe 是否能被 IIS 启动、PHP 是否允许被 FastCGI 调用。这三步任何一个断开,页面就只会下载或报错,不会执行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











