phpEnv需依赖Nginx与OpenSSL协同实现HTTPS:一、确认PHP加载openssl扩展(Windows下为php_openssl.dll);二、用mkcert生成可信本地证书并导入系统根证书库;三、在phpEnv域名管理中正确配置绝对路径的.pem与.key文件;四、Nginx server块中添加fastcgi_param HTTPS on及TLS协议与密钥套件;五、 hosts绑定自定义域名并使用协议相对路径避免混合内容。
php
Env 本身不内置 HTTPS 支持,必须依赖底层 Web 服务器(Nginx)和 OpenSSL 扩展协同工作;开启 OpenSSL 是前提,但仅启用扩展远远不够——证书路径、Nginx 配置、浏览器信任链三者缺一不可。
确认 phpEnv 中的 PHP 已加载 open
ssl
扩展
很多人卡在第一步:以为勾选了 SSL 就万事大吉,结果
仍报
。真实原因是 phpEnv 启动的 PHP 进程没加载 openssl。
打开 phpEnv 控制面板 → 点击「PHP 设置」→ 查看当前 PHP 版本对应的实际
路径(别信默认路径,用
命令验证)
编辑该
,搜索
:Windows 下必须是
,且确保
文件真实存在于
目录
保存后,在 phpEnv 面板中「重启 PHP 服务」(不是只重启 Nginx),然后运行
,输出
才算通过
用 mkcert 生成可信本地证书(比手敲 openssl 更稳)
phpEnv 的 Nginx 默认不信任自签名证书,浏览器会拦截;
生成的证书会被系统根证书库自动信任,避免每次点「高级→继续访问」。
以管理员身份打开 PowerShell,执行:
(若未装 Chocolatey,先按官网流程安装)
运行
,弹出窗口点「安装」到「受信任的根证书颁发机构」
在 phpEnv 项目目录(如
)下执行:
,生成
(证书)和
(私钥)
注意:不要直接把 .pem 文件丢进 phpEnv 的证书选择框——它要求 PEM 格式但常因换行或 BOM 报错;用记事本另存为 UTF-8 无 BOM 格式再试
在 phpEnv 中正确绑定证书到 Nginx 虚拟主机
phpEnv 的「域名管理」界面看似简单,但证书路径填错会导致 Nginx 启动失败,日志里只显示
。
稿定在线PS
PS软件网页版
下载
立即学习
“
PHP免费学习笔记(深入)
”;
右键目标域名 → 「配置 SSL」→ 在「证书文件」栏填绝对路径,例如:
(反斜杠会出错,必须用正斜杠或双反斜杠)
「私钥文件」栏填:
关键细节:phpEnv 的 Nginx 配置模板默认不加
和
,老旧客户端可能握手失败;建议手动编辑生成的
(位于
对应域名配置块),补上这两行
保存后,phpEnv 会自动重载 Nginx;若失败,去
查具体哪一行配置语法错误
绕过混合内容与 $_SERVER['HTTPS'] 检测失效问题
即使 HTTPS 能打开,PHP 代码里
仍是空,或者页面加载 HTTP 资源被浏览器阻止——这通常是因为 Nginx 没把 HTTPS 状态透传给 PHP。
检查 phpEnv 自动生成的 Nginx server 块里是否有:
(没有就手动加上,放在
之后)
前端资源(CSS/JS/图片)地址不能写死
,改用协议相对路径:
,或用 PHP 判断:
如果用了 Laravel 或 WordPress 等框架,还需在配置里显式设
,否则生成的链接仍是 http
最易忽略的是:mkcert 生成的证书只对指定域名有效,
和
不在信任范围内;开发时务必用
这类自定义域名,并在
里加一行
。
file_get_contents("https://")SSL operation failedphp.iniphp --iniphp.iniextension=opensslextension=php_openssl.dllphp_openssl.dllext/php -r "var_dump(extension_loaded('openssl'));"bool(true)mkcertchoco install mkcertmkcert -installC:\phpenv\www\myappmkcert myapp.testmyapp.test.pemmyapp.test-key.pemnginx: [emerg] SSL_CTX_use_certificate_chain_file() failedC:/phpenv/www/myapp/myapp.test.pemC:/phpenv/www/myapp/myapp.test-key.pemssl_protocols TLSv1.2 TLSv1.3;ssl_ciphersnginx.confC:\phpenv\conf\nginx\C:\phpenv\logs\nginx\error.log$_SERVER['HTTPS']fastcgi_param HTTPS on;include fastcgi.conf;http:////myapp.test/css/app.cssecho ($_SERVER['HTTPS'] ?? '') === 'on' ? 'https' : 'http';APP_URL=https://myapp.testlocalhost127.0.0.1myapp.testC:\Windows\System32\drivers\etc\hosts127.0.0.1 myapp.test