phpEnv启用HTTPS需用mkcert生成可信证书并配置Apache:启用mod_ssl模块、修改httpd-ssl.conf指定证书路径、确保Listen 443开启,PHP中应优先判断$_SERVER['HTTPS']==='on'。

phpEnv 是 Windows 下集成 Apache + PHP 的轻量环境,它默认不启用 HTTPS,也没有预置证书。要让它跑 HTTPS,核心不是“给 PHP 配 SSL”,而是**让 Apache 正确加载 mod_ssl,并指向合法、浏览器能信任的证书文件**。自签名证书在 Chrome/Firefox 里会被直接拦截(NET::ERR_CERT_INVALID),所以不能用 openssl req -x509 手动生成。
为什么不能用 openssl 自签 localhost 证书
Chrome 从 2021 年起强制要求本地证书必须带 subjectAltName(SAN),且必须由本地信任的 CA 签发。手动生成的证书即使加了 SAN,也缺乏可信根证书,浏览器仍报错。正确做法是用 mkcert 工具——它会帮你生成证书,并把自建的根证书自动安装进系统和浏览器信任库。
用 mkcert 生成 localhost 可信证书
先确保已安装 mkcert(Windows 上推荐用 Chocolatey:choco install mkcert;macOS 用 brew install mkcert)。
- 运行
mkcert -install—— 这步必须做,否则浏览器不认 - 再运行
mkcert localhost 127.0.0.1 ::1,会生成两个文件:localhost+2.pem(证书)和localhost+2-key.pem(私钥) - 把这两个文件复制到
phpEnvpacheconfssl目录下(若无此目录请手动创建)
修改 phpEnv 的 Apache 配置启用 HTTPS
phpEnv 的 Apache 默认不启用 SSL 模块,也不监听 443 端口。你需要改两处配置文件:
- 打开
phpEnvpacheconfhttpd.conf,取消以下两行的注释:LoadModule ssl_module modules/mod_ssl.soInclude conf/extra/httpd-ssl.conf - 打开
phpEnvpacheconfextrahttpd-ssl.conf,找到<VirtualHost _default_:443>块,修改关键项:ServerName localhost:443DocumentRoot "E:/phpEnv/www"(按你实际项目路径填)SSLCertificateFile "E:/phpEnv/apache/conf/ssl/localhost+2.pem"SSLCertificateKeyFile "E:/phpEnv/apache/conf/ssl/localhost+2-key.pem" - 确保
Listen 443在httpd.conf中未被注释
改完后重启 phpEnv 的 Apache 服务。首次访问 https://localhost 时,Chrome 仍可能弹“不安全”警告——点“高级”→“继续前往 localhost(不安全)”即可,仅第一次需要,之后就信任了。
立即学习“PHP免费学习笔记(深入)”;
PHP 代码里怎么判断当前是 HTTPS
Apache 启用 SSL 后,$_SERVER['HTTPS'] 通常会是 "on",但 phpEnv 的 Apache 若未显式设置,有时会为空。最稳妥的写法是:
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
// 当前是 HTTPS
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
// 有反向代理时备用判断(phpEnv 一般不用)
}
注意:别依赖 $_SERVER['SERVER_PORT'] === '443',因为端口可被代理或重写,不可靠。
真正容易被忽略的是私钥权限和路径写法:Windows 下 Apache 对私钥文件路径中的反斜杠 很敏感,务必统一用正斜杠 / 或双反斜杠 \;另外,如果证书路径写错或文件不存在,Apache 启动会静默失败——此时要看 phpEnvpachelogserror.log 里的具体报错,而不是只看界面是否启动成功。



















