apache多域名https必须手动配置:每个块独占一套证书与私钥,启用mod_ssl,确保sslengine on,且sslstrictsnivhostcheck off置于虚拟主机外;windows下需校验openssl dll存在、证书链顺序正确、私钥权限开放,并通过hosts+openssl s_client验证sni生效。

phpEnv 本身不提供图形化 SNI 配置入口,Apache 多域名 HTTPS 必须手动改 httpd-vhosts.conf、配证书路径、开 mod_ssl,且每个 <virtualhost></virtualhost> 块必须独占一套证书文件。
确认 Apache 模式和 mod_ssl 已启用
phpEnv 托盘图标右键 → “切换 Web Server” → 确保选的是 Apache(不是 Nginx);否则所有 Apache 配置都无效。接着检查 D:phpEnvApacheconfhttpd.conf 是否有这两行且未被注释:
LoadModule ssl_module modules/mod_ssl.soInclude conf/extra/httpd-ssl.conf
如果 httpd-ssl.conf 不存在或被删过,可从 Apache 官方二进制包补一个基础版,或至少确保 Listen 443 和 SSLRandomSeed 类似配置存在。Windows 下常见问题是 OpenSSL DLL 缺失,启动失败时日志里会报 Cannot load mod_ssl.so —— 此时需核对 phpEnv 自带的 Apacheinlibcrypto-1_1-x64.dll 是否真实存在。
为每个域名写独立的 <virtualhost></virtualhost> 块
不要复用同一张证书,也不要只配一个 <virtualhost></virtualhost> 然后靠 ServerAlias 堆域名——SNI 要求每个域名对应一个明确的虚拟主机定义。以 site-a.test 和 site-b.test 为例,在 D:phpEnvApacheconfextrahttpd-vhosts.conf 末尾追加:
<virtualhost>
ServerName site-a.test
DocumentRoot "D:/www/site-a"
SSLEngine on
SSLCertificateFile "D:/ssl/site-a.crt"
SSLCertificateKeyFile "D:/ssl/site-a.key"
SSLCertificateChainFile "D:/ssl/site-a.chain"
<directory>
Require all granted
</directory></virtualhost><virtualhost>
ServerName site-b.test
DocumentRoot "D:/www/site-b"
SSLEngine on
SSLCertificateFile "D:/ssl/site-b.crt"
SSLCertificateKeyFile "D:/ssl/site-b.key"
SSLCertificateChainFile "D:/ssl/site-b.chain"
<directory>
Require all granted
</directory></virtualhost>
注意点:
-
SSLCertificateFile必须是站点专属证书(不含私钥),不能指向全局server.crt -
SSLCertificateKeyFile必须匹配上一行证书的私钥,不能共用 - 路径中用正斜杠
/或双反斜杠\,单反斜杠在 Apache 配置里会被转义出错 - Windows 下若用 Let’s Encrypt,推荐用
certbot --standalone -d site-a.test --cert-path D:/ssl/site-a.crt --key-path D:/ssl/site-a.key单独申请,避免 fullchain.pem 混用
hosts 文件 + 浏览器验证必须分步走
仅改配置不会让域名生效,三步缺一不可:
- 用管理员权限编辑
C:WindowsSystem32driversetchosts,追加:127.0.0.1 site-a.test127.0.0.1 site-b.test - 执行
ipconfig /flushdns清 DNS 缓存 - 用
openssl s_client -connect site-a.test:443 -servername site-a.test直连验证——看返回的Certificate chain是否真含site-a.test的 CN 或 SAN;浏览器访问容易受 HSTS、缓存、自动跳转干扰,不能信第一眼
常见失败现象:访问 https://site-b.test 显示 site-a.test 的证书,说明 SNI 没触发,大概率是 SSLCertificateFile 路径写错、Apache 没重载、或客户端(比如旧版 curl)根本不发 SNI 扩展。
SSLStrictSNIVHostCheck off 是 Windows 本地开发的务实选择
这个指令必须放在 <virtualhost></virtualhost> 外部,比如加在 httpd-ssl.conf 底部或 httpd-vhosts.conf 开头:
SSLStrictSNIVHostCheck off
它让不支持 SNI 的请求 fallback 到第一个定义的 <virtualhost></virtualhost>,而不是直接断连。phpEnv 是本地环境,你大概率不需要兼容 IE6 或 Android 2.x,但设为 on 后,某些命令行工具(如旧版 Postman CLI)会连不上,查日志看到 no VirtualHost matches 就知道是这问题。设为 off 后仍要确保每个 ServerName 唯一,否则 fallback 会混乱。
最易被忽略的是证书链顺序和私钥权限:Windows 下 Apache 进程默认没权限读取用户目录下的 .key 文件,建议把证书全放 D:/ssl/ 这种非系统路径,并确认文件属性里“安全”标签页中 SYSTEM 和 Administrators 有读取权。一旦 Apache 启动报 SSL Library Error: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch,基本就是证书和私钥不配对,别急着重装,先用 openssl x509 -noout -modulus -in site-a.crt | openssl md5 和 openssl rsa -noout -modulus -in site-a.key | openssl md5 对比哈希值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











