Win7搭建PHP本地HTTPS环境的核心难点是Apache必须启用mod_ssl、使用含SAN的证书、显式设置SetEnv HTTPS on;缺一导致$_SERVER['HTTPS']为空,引发重定向循环、setcookie失效等问题。

Win7 搭建 PHP 本地环境并配置 HTTPS,核心难点不是 PHP 本身,而是 Apache 必须加载 mod_ssl、用含 subjectAltName(SAN)的证书、且必须显式设置 SetEnv HTTPS on——漏掉任一环,$_SERVER['HTTPS'] 就是空字符串,重定向打转、setcookie(..., true) 失效、混合内容警告全都会出现。
Apache 必须启用 mod_ssl 并确认 OpenSSL 支持
Win7 自带的 Apache(如 XAMPP、phpStudy、或手动安装的 Apache Lounge)默认不启用 SSL 模块。PHP 是否启用 openssl 扩展只影响出站请求(如 cURL 访问外部 HTTPS 接口),和本地 HTTPS 服务无关;但 Apache 若没加载 mod_ssl,443 端口根本不会响应。
- 打开
httpd.conf,取消以下两行注释:LoadModule ssl_module modules/mod_ssl.so和Include conf/extra/httpd-ssl.conf - 确保
mod_socache_shmcb.so也已加载(TLS 握手需要) - 重启 Apache 后执行
httpd -t,输出Syntax OK才算通过 - 检查
phpinfo()页面中OpenSSL Support显示enabled,否则file_get_contents('https://...')会报错
别用 openssl req 手动生成 localhost 证书
Win7 上用 openssl req -x509 生成的证书默认不含 subjectAltName 字段,Chrome / Edge / Firefox 在 2021 年后一律拒绝,直接显示 NET::ERR_CERT_INVALID,且“继续前往”按钮都不可点——这不是浏览器缓存问题,是协议级拦截。
- 必须用
mkcert(v1.4.8+):下载 Windows 版 exe,管理员身份运行mkcert -install(只做一次,把根证书注入系统信任库) - 在 Apache
conf/目录下新建ssl/文件夹,然后执行:mkcert localhost 127.0.0.1 ::1 - 生成两个文件:
localhost+3.pem(证书)和localhost+3-key.pem(私钥),路径里不能有中文或空格 - 证书权限无需改(Windows 不校验文件权限),但私钥文件不能被其他用户读取(若共享环境,右键 → 属性 → 安全 → 只留 Administrators 和 SYSTEM)
httpd-ssl.conf 必须显式声明 SetEnv HTTPS on
Apache 加载了证书、监听了 443 端口,不代表 PHP 就知道这是 HTTPS 请求。$_SERVER['HTTPS'] 是 Apache 通过环境变量传给 PHP 的,不是自动推断出来的。不设这个,所有依赖它的逻辑都会失效。
立即学习“PHP免费学习笔记(深入)”;
- 编辑
conf/extra/httpd-ssl.conf,整个<VirtualHost *:443>块内必须包含:SetEnv HTTPS on -
SSLCertificateFile必须指向.pem(不是.crt或.cer),且内容要包含完整证书链(mkcert生成的已满足) -
DocumentRoot和<Directory>路径必须完全一致,且末尾不要加斜杠(D:/www✅,D:/www/❌) - 验证方式:新建
test.php,写<?php var_dump($_SERVER['HTTPS']); ?>,访问https://localhost/test.php应输出string(2) "on"
首次访问 https://localhost 仍提示不安全?检查这三点
Win7 + mkcert 配置后仍看到红色警告页,大概率不是证书问题,而是配置残留或路径错误。
- 确认
mkcert -install是以管理员身份运行的——普通用户权限无法写入系统根证书存储区 - 检查
httpd-ssl.conf中SSLCertificateFile路径是否用了正斜杠/或双反斜杠\(单反斜杠在 Apache 配置里会被转义,导致路径错乱) - 关闭所有浏览器窗口再重开,Chrome 有时会缓存旧的证书错误状态;也可在地址栏输入
chrome://restart强制刷新进程 - 如果用了 phpStudy,它自带的 Apache 控制面板可能覆盖了你的
httpd-ssl.conf修改,建议直接用 phpStudy 的「SSL 设置」图形界面导入证书,而非手动改配置
Win7 的 TLS 1.0/1.1 默认启用,而现代证书(尤其是 Let’s Encrypt)要求 TLS 1.2+,但本地开发用 mkcert 生成的证书不受此限;真正卡住你的,永远是那三件事:模块没开、证书没 SAN、SetEnv HTTPS on 没写——其余都是路径和权限的细节问题。



















