本地PHP开发模拟HTTPS或生产启用SSL,核心是Web服务器正确加载证书并透传HTTPS状态,否则$_SERVER['HTTPS']为空、混合内容被拦截、API调用失败;需启用PHP openssl扩展、用mkcert生成含SAN的可信证书配置Apache(含SetEnv HTTPS on),生产环境则用Certbot申请Let’s Encrypt证书并自动部署。

在本地PHP开发中模拟HTTPS环境,或为生产站点启用真实SSL加密,核心是让Web服务器正确加载证书并准确向PHP传递加密状态,否则$_SERVER['HTTPS']为空、混合内容被拦截、API调用失败等问题会立刻出现。
确认PHP已启用OpenSSL扩展
PHP必须加载openssl扩展,否则无法执行file_get_contents访问HTTPS资源、cURL启用SSL验证等操作。
打开php.ini文件,查找extension=openssl这一行,确保其未被分号注释;若为;extension=openssl,则删除开头的分号。
保存php.ini后重启Apache或Nginx服务,再创建test.php文件(内容为<?php phpinfo(); ?>),在浏览器中访问并搜索“openssl”,确认“OpenSSL Support”显示为enabled。
立即学习“PHP免费学习笔记(深入)”;
本地开发:用mkcert生成可信证书并配置Apache
Chrome/Edge/Safari对localhost的自签名证书拦截越来越严格,必须使用含subjectAltName(SAN)的证书,否则直接报NET::ERR_CERT_INVALID且无法绕过。
方法一:一键生成并信任根证书
下载mkcert v1.4.8+(支持macOS/Windows/Linux),解压后加入系统PATH;以管理员身份运行CMD或PowerShell,执行【mkcert -install】——这一步只需做一次,将本地CA根证书注入系统和浏览器信任库。
方法二:生成含SAN的本地证书
进入phpEnv\apache\conf\目录,新建ssl子目录;执行mkcert localhost 127.0.0.1 ::1,生成localhost+3.pem(证书)和localhost+3-key.pem(私钥),全部放入conf\ssl\目录。
方法三:配置Apache虚拟主机并透传HTTPS状态
编辑phpEnv\apache\conf\extra\httpd-ssl.conf,替换全部内容为以下区块(注意DocumentRoot路径需与你实际项目根目录一致):
<VirtualHost *:443>
ServerName localhost
DocumentRoot "D:/phpEnv/www"
SSLEngine on
SSLCertificateFile "conf/ssl/localhost+3.pem"
SSLCertificateKeyFile "conf/ssl/localhost+3-key.pem"
【SetEnv HTTPS on】
<Directory "D:/phpEnv/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
生产环境:用Certbot自动申请Let’s Encrypt免费证书
Let’s Encrypt不支持纯IP或localhost验证,只适用于有可解析域名的服务器,且必须能通过HTTP 80端口完成ACME挑战。
第一步:安装Certbot工具
Ubuntu/Debian执行sudo apt install certbot python3-certbot-apache;CentOS/RHEL执行sudo yum install certbot python3-certbot-apache。
第二步:申请并自动部署证书
运行sudo certbot --apache -d yourdomain.com -d www.yourdomain.com,Certbot会自动检测Apache配置、验证域名所有权、生成证书,并修改虚拟主机配置启用HTTPS。
第三步:设置自动续期
Certbot默认已配置systemd timer(Ubuntu 22.04+)或cron任务,但建议手动测试:sudo certbot renew --dry-run。若失败,检查防火墙是否放行80/443端口、DNS解析是否生效、.well-known/acme-challenge目录是否可被公网访问。
强制HTTP跳转HTTPS(Apache与Nginx通用)
仅开启443端口不够,用户仍可能通过http://访问,导致Cookie未标记Secure、资源加载不安全、OAuth回调被拒绝。
Apache方案:在<VirtualHost *:80>区块内添加重定向规则
Redirect permanent / https://yourdomain.com/
Nginx方案:在监听80端口的server块中添加
return 301 https://$host$request_uri;
注意:若使用CDN或反向代理(如Cloudflare),需额外配置X-Forwarded-Proto头识别原始协议,否则重定向会死循环。
验证HTTPS是否真正生效
访问https://localhost(本地)或https://yourdomain.com(生产),检查浏览器地址栏是否显示锁形图标。
在PHP代码中插入var_dump($_SERVER['HTTPS']);,输出必须为字符串"on",而非空值或false。
打开浏览器开发者工具→Network标签页,刷新页面,确认所有JS/CSS/图片请求的Protocol列显示h2(HTTP/2)或https,无mixed-content警告。



















