PHP 7.4 在 IIS 中配置虚拟目录并启用 HTTPS 需同步完成三件事:为虚拟目录所在站点绑定 HTTPS 443 端口并指定证书;确保物理路径权限(IIS_IUSRS/IUSR 读取与执行);在 FastCGI 设置中添加 HTTPS=on 和 HTTP_X_FORWARDED_PROTO=https 环境变量,并启用 php_openssl.dll、设 cgi.force_redirect=0,最后在虚拟目录根部署专用 web.config 启用重写规则。

PHP 7.4 在 IIS 中配置虚拟目录并启用 HTTPS 访问
IIS 默认不自动将虚拟目录与 HTTPS 绑定,且 PHP 处理程序映射、SSL 设置、路径解析三者稍有错位,就会导致404(文件找不到)、500.19(配置错误)或空白响应。关键不是“加个证书就行”,而是让 IIS 明确知道:哪个目录走 HTTPS、哪个 PHP 可执行文件处理它、哪些请求头和重写规则不能丢。
常见错误现象包括:
- HTTP 正常访问虚拟目录,HTTPS 下直接 404 或下载
.php文件 - 浏览器提示“此网站无法提供安全连接”,但证书已安装
-
phpinfo()在根目录可打开,虚拟目录下报FastCGI Error
必须同步完成三件事:
- 在 IIS 管理器中为该虚拟目录所在的站点「绑定 HTTPS 端口 443」,并指定已导入的证书(不能只绑在默认站点)
- 确认该虚拟目录的「物理路径」指向的是真实 PHP 项目路径(如
D:\inetpub\wwwroot\myapp\public),而非仅符号链接或别名路径 - 右键点击该虚拟目录 → 「编辑权限」→ 确保
IIS_IUSRS和IUSR对该路径有「读取 & 执行」权限(缺一不可)
PHP 7.4 的 php.ini 必须启用 openssl 且禁用 cgi.force_redirect
HTTPS 请求经由 SSL 解密后仍需被 PHP 正确识别协议类型,否则$_SERVER['HTTPS'] 恒为 off,框架生成的 URL 全是 http://,重定向死循环或资源加载失败。
检查并修改 php.ini 中以下两项:
-
extension=php_openssl.dll—— 前面的分号必须去掉;若扩展加载失败,php -m | findstr openssl会无输出 -
cgi.force_redirect = 0—— IIS 使用 FastCGI 模式,此项必须为 0;设为 1 会导致所有 HTTPS 请求返回502 Bad Gateway
改完重启 IIS:iisreset /restart,不要只刷新管理器界面。
立即学习“PHP免费学习笔记(深入)”;
虚拟目录下 PHP 脚本无法识别 HTTPS 协议?补上服务器变量映射
IIS 不像 Apache 自动注入HTTPS=on,FastCGI 环境里 $_SERVER['HTTPS'] 默认为空。Laravel/ThinkPHP 等框架依赖它判断当前是否为安全连接。
解决方法是在 IIS 的「处理程序映射」中,为该虚拟目录或其上级站点添加环境变量映射:
- 选中站点 → 双击「处理程序映射」→ 右侧「编辑功能权限」→ 勾选「读取」和「脚本」
- 回到站点 → 双击「FastCGI 设置」→ 找到
php-cgi.exe对应条目 → 点击「编辑」→ 「环境变量」→ 添加: HTTPS = on-
HTTP_X_FORWARDED_PROTO = https(如果前端还套了反向代理)
这个步骤漏掉,url()、asset()、redirect()->secure() 全部失效,且不会报错,只会静默生成错误链接。
伪静态和重写规则在 HTTPS 虚拟目录中要单独配
IIS 的 URL 重写模块(URL Rewrite)规则默认作用于整个站点,但虚拟目录可能有自己的入口(如 Laravel 的public/index.php),而根站点规则会干扰它。
正确做法是:在虚拟目录级别单独添加 web.config,而不是复用父级配置。内容示例如下(放在虚拟目录根,如 D:\inetpub\wwwroot\myapp\public\web.config):
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)/$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" url="/{R:1}" redirectType="Permanent" />
</rule>
<rule name="Imported Rule 2" stopProcessing="true">
<match url="^" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
注意:这个 web.config 必须放在虚拟目录的物理路径下,且 IIS 必须已安装「URL 重写模块」(非默认组件,需单独下载安装)。没装的话,规则完全不生效,也不会报错。
最易被忽略的是:HTTPS 虚拟目录的权限继承、FastCGI 环境变量覆盖、以及 web.config 的物理位置——三者任一出错,都会表现为“看起来配好了,但就是不工作”。



















