需启用phpenv中apache的mod_ssl模块、用mkcert生成本地证书并配置httpd-ssl.conf,同时添加ssloptions +stdenvvars确保$_server['https']正确为'on'。

phpEnv 是 Windows 下轻量级 PHP 本地环境(集成 Apache + PHP + MySQL),但它默认不启用 HTTPS,也无法直接通过 php -S 启动 HTTPS——必须靠 Apache 的 mod_ssl 和正确证书配置才能跑起来。你真正要解决的,是「让 phpEnv 中的 Apache 响应 https://localhost 或自定义域名(如 https://test.local)」,而不是 PHP 本身“配 SSL”。
确认 phpEnv 的 Apache 已加载 mod_ssl 模块
phpEnv 的 Apache 版本通常较旧(如 2.4.52),mod_ssl 模块虽存在但默认未启用。若跳过这步,后续所有 HTTPS 配置都会静默失效。
- 打开 phpEnv 安装目录下的
Apache/conf/httpd.conf - 搜索
LoadModule ssl_module,确保该行未被注释(即前面没有#);若被注释,删掉# - 再搜索
Include conf/extra/httpd-ssl.conf,同样确认未被注释——这是 Apache 加载 SSL 虚拟主机的关键入口 - 保存后,用 phpEnv 控制面板「重启 Apache」,或命令行执行
httpd -t验证语法无误
常见错误:重启后访问 https://localhost 直接连接被拒绝(而非证书错误),大概率是 mod_ssl 没加载成功,或 httpd-ssl.conf 未被 include。
用 mkcert 生成可被浏览器信任的本地证书
别用 OpenSSL 手动生成 openssl req -x509,Chrome / Edge / Safari 自 2021 年起强制要求证书含 subjectAltName(SAN),否则报 NET::ERR_CERT_INVALID,且无法绕过。
- 下载
mkcert(Windows 推荐 v1.4.8+),解压后放系统 PATH 下(如C:\Windows\System32) - 管理员权限运行 CMD 或 PowerShell,执行:
mkcert -install(仅需一次,它会把根证书注入系统信任库) - 在 phpEnv 的 Apache
conf/ssl/目录下执行:mkcert localhost 127.0.0.1 ::1 - 生成两个文件:
localhost+3.pem(证书)和localhost+3-key.pem(私钥)
注意路径权限:Windows 上 Apache 默认以 SYSTEM 身份运行,私钥文件不能有“继承权限”,右键 → 属性 → 安全 → 高级 → 取消“从父项继承权限”,只保留 SYSTEM 和 Administrators 的完全控制。
修改 httpd-ssl.conf 配置虚拟主机并指向证书
phpEnv 的 httpd-ssl.conf 通常位于 Apache/conf/extra/,它定义了默认的 *:443 虚拟主机。你需要改三处关键点:
-
DocumentRoot改为你实际的项目路径(如"D:/phpEnv/www"),别留默认的"${SRVROOT}/htdocs" -
SSLCertificateFile指向你用 mkcert 生成的 PEM 证书(如"conf/ssl/localhost+3.pem") -
SSLCertificateKeyFile指向对应私钥(如"conf/ssl/localhost+3-key.pem") - 加上
<directory> Require all granted </directory>,否则会 403 Forbidden
如果想用自定义域名(如 https://test.local),还需两步:
① 修改系统 C:\Windows\System32\drivers\etc\hosts,加一行 127.0.0.1 test.local;
② mkcert 时写 mkcert test.local 127.0.0.1 ::1,并在 httpd-ssl.conf 中把 ServerName 改为 test.local。
PHP 中检测 HTTPS 状态必须依赖 Apache 透传
即使 HTTPS 页面能打开,$_SERVER['HTTPS'] 仍可能是空或 off——这是因为 phpEnv 的 Apache 默认没把 TLS 状态传给 PHP CGI/FastCGI 环境。
- 打开
Apache/conf/extra/httpd-ssl.conf,在<virtualhost></virtualhost>块内添加:SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown(兼容性兜底) - 更重要的是,在同一
<virtualhost></virtualhost>内添加:SSLOptions +StdEnvVars - 重启 Apache 后,
$_SERVER['HTTPS']就会是on,$_SERVER['SERVER_PORT']为443
容易被忽略的一点:phpEnv 默认用模块模式(mod_php)运行 PHP,不是 PHP-FPM。所以不用像 Nginx 那样手动设 fastcgi_param HTTPS on;但若你后期切换为 PHP-FPM,则必须在 Apache 的 ProxyPassMatch 或 SetHandler 区块里显式传递 HTTPS=on 环境变量。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











