根本原因是虚拟目录未单独配置php处理器映射,iis不自动继承父站点的*.php映射;须右键虚拟目录→添加fastcgimodule映射指向php-cgi.exe,并设置ntfs与iis目录权限、phprc环境变量及session/upload路径可写。

为什么 IIS 虚拟目录里 PHP 文件不执行,只下载或报 500?
根本原因不是虚拟目录本身的问题,而是该目录未被 IIS 明确赋予 PHP 处理能力。IIS 默认只对网站根目录或显式配置了处理器映射的路径执行 php-cgi.exe;虚拟目录只是 URL 别名,它不自动继承父站点的处理程序映射。如果你在虚拟目录下访问 info.php 却触发文件下载、空白页或 500 错误,大概率是这里漏配了。
给 IIS 虚拟目录添加 PHP 处理器映射(非继承)
不能依赖“父站点已配 *.php 就万事大吉”——IIS 的处理器映射默认不向下继承到虚拟目录。你必须为虚拟目录单独绑定,且注意作用域层级:
- 在 IIS 管理器中,**右键点击虚拟目录节点**(不是父网站,也不是物理路径),选择“处理程序映射”
- 点击右侧“添加模块映射”,填入:
- 请求路径:
*.php - 模块:
FastCgiModule - 可执行文件:
C:\php\php-cgi.exe(路径需与你的 FastCGI 全局配置一致) - 名称:
PHP_via_FastCGI_in_vdir(建议命名带标识,避免冲突)
- 请求路径:
- 务必勾选“允许访问此资源的请求”,否则会返回 404 或 401
- 不要点“请求限制”里的“调用处理程序仅限于读取访问”——PHP 需要 POST/PUT 等方法,禁用该选项
虚拟目录 NTFS 权限和 IIS 目录权限双校验
即使处理器映射正确,权限不足也会导致 500.19(配置错误)或 500.100(内部服务器错误),尤其常见于 session 写入失败或扩展加载失败:
- NTFS 权限:确保
IIS_IUSRS对虚拟目录**有“读取和执行”+“列出文件夹内容”**;若 PHP 需写日志、上传、缓存,则还需“修改”权限 - IIS 目录权限面板(右键虚拟目录 → 属性 → 目录 → 权限):必须勾选“读取”和“脚本资源访问”;“写入”一般不勾(除非明确需要 HTTP PUT);“执行权限”必须设为“纯脚本”
- 特别注意:
php.ini中的upload_tmp_dir和session.save_path指向的路径,也需被IIS_IUSRS可写,否则$_FILES或session_start()直接失败
FastCGI 应用池环境变量 PHPRC 是否生效到虚拟目录?
是的,但仅当 FastCGI 全局设置中已正确定义 PHPRC。如果虚拟目录下 PHP 报错说找不到扩展、时区未设或 extension_dir 错误,说明 php.ini 没加载成功:
- 检查 FastCGI 设置里是否已添加环境变量:
PHPRC = C:\php\(末尾不加反斜杠) - 确认
php.ini文件真实存在于该路径,且文件名就是php.ini(不是php.ini-development) - 重启整个 IIS(不只是应用池):运行
iisreset,否则PHPRC变更不生效 - 验证方式:在虚拟目录下放一个
test.php,内容为<?php echo get_cfg_var('cfg_file_path'); ?>,输出应为C:\php\php.ini
虚拟目录本身不改变 PHP 解析逻辑,但它放大了配置遗漏和权限断层——每个环节都得独立过一遍,少一环就卡住。最常被跳过的其实是“右键虚拟目录→处理程序映射”这一步,而不是网站根目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











