Windows Server 上部署好的站点,访问 index.php 直接弹出下载框,或者返回一个 404.3。多数情况不是代码问题,是 IIS 没把 .php 交给 PHP 处理。iis php 这套组合要靠 FastCGI 接起来,配一次能记很久。

先准备 PHP。下载 Windows 版 PHP 的 zip 包,解压到 C:/PHP,把 php.ini-production 复制一份改名为 php.ini。打开 extension_dir,指向 C:/PHP/ext,再按需开 mysqli、curl、mbstring、openssl 几个扩展。IIS 用非线程安全版就行,位数和系统对上,选错启动就报 500。

在 IIS 里加处理程序映射

服务器管理器里装好 CGI 功能,打开 IIS 管理器,进站点,点处理程序映射,再点添加模块映射。请求路径填 *.php,模块选 FastCgiModule,可执行文件填 C:/PHP/php-cgi.exe,名称写 PHP_via_FastCGI,确定。

配完在站点根目录放一个 phpinfo 文件测试。能出页面说明通了;还是下载,多半是映射没落到具体站点,或者处理程序顺序被静态文件抢了。

401 和 500 分别查什么

401.3 一般是 NTFS 权限问题,给 IIS_IUSRS 组加读取和执行权限。500 错误先看 php.ini 里的 log_errors 和 error_log,再翻 Windows 事件查看器,FastCGI 进程崩溃那里有记录。

还有两个小地方:extension_dir 写绝对路径,别用相对路径;改完 php.ini 必须重启 IIS 或回收应用程序池,否则不生效。php-cgi.exe 的路径尽量别带空格,带空格容易在参数解析上出问题。

要不要用第三方集成包

图省事可以用集成环境,但生产环境更建议分开装,版本和扩展自己可控。iis php 跑老系统没问题,新项目如果没历史包袱,Linux 加 Nginx 的资料更多,排错也方便。

收个尾:先跑通 phpinfo,再谈伪静态和 HTTPS,顺序反了会多花一晚上。