HTTPS不生效的四大主因:Web服务器未监听443端口、证书链不完整、PHP代码硬编码HTTP协议、Let’s Encrypt续期后未重载服务。需逐项排查监听状态、证书路径与完整性、URL生成逻辑及Nginx重载与权限。

PHP 小程序后端部署后 HTTPS 不生效,先确认 Nginx/Apache 是否真在监听 443
很多「证书装不上」的问题,本质是 Web 服务器压根没启用 SSL 监听。小程序强制要求 https:// 接口,但你可能只配了 http:// 的 80 端口,或 443 端口被防火墙/安全组拦了。
- 运行
netstat -tuln | grep :443,看是否有进程在监听 443(如nginx或apache2) - 检查 Nginx 配置里是否真有
listen 443 ssl;,且ssl_certificate和ssl_certificate_key指向的路径存在、权限可读(ls -l /path/to/cert.pem) - 云服务器(如阿里云、腾讯云)必须在安全组里放行 TCP 443 端口——光配对证书没用,流量进不来
证书链不完整导致微信校验失败
小程序后台填写的「request 合法域名」会触发微信服务端主动发起 HTTPS 请求校验。如果证书链缺失(比如只传了站点证书,没传中间 CA),微信会握手失败,报错类似 SSL routines:tls_process_server_certificate:certificate verify failed。
- 用
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com查看输出末尾是否有Verify return code: 0 (ok);若为 21(unable to verify the first certificate),就是链不全 - 从证书提供商下载完整证书包,通常含
fullchain.pem(证书+中间 CA)和privkey.pem;Nginx 中应使用ssl_certificate fullchain.pem,而非单独的domain.crt - 别手动拼接证书——顺序必须是:站点证书在最前,中间 CA 在后,根证书不放进去
PHP 后端代码里硬编码了 http:// 导致跳转或请求降级
即使 Nginx 已正确启用 HTTPS,PHP 代码中若用 $_SERVER['HTTP_HOST'] 拼 URL,或直接写死 http:// 前缀,会导致接口返回的图片地址、跳转链接、签名用的原始 URL 仍是 HTTP,小程序拒绝加载。
- 检查所有生成 URL 的地方,尤其是
get_site_url()、api_url()类函数,确保协议由$_SERVER['HTTPS'] === 'on'或$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'判断(注意:反向代理场景下,真实协议常在X-Forwarded-Proto头里) - Nginx 配置中需透传该头:
proxy_set_header X-Forwarded-Proto $scheme; - 微信开发者工具「调试器 → Network」里点开任意请求,看 Request URL 是不是
https://开头;如果不是,问题一定出在 PHP 输出层
Let’s Encrypt 证书自动续期后没重载 Nginx,或文件权限变更
用 certbot 自动续期很常见,但续期成功 ≠ 服务已加载新证书。尤其当脚本用 root 续期,而 Nginx worker 进程以 www-data 或 nginx 用户运行时,新证书文件可能因属主/权限不对导致无法读取。
立即学习“PHP免费学习笔记(深入)”;
- 续期后务必执行
nginx -t && systemctl reload nginx(Apache 对应apachectl configtest && systemctl reload apache2) - 检查证书文件权限:
cert.pem和privkey.pem应至少对 Nginx worker 用户可读(如chmod 644 cert.pem,chown root:www-data cert.pem) - 查看 Nginx 错误日志:
tail -f /var/log/nginx/error.log,搜索SSL_CTX_use_certificate_chain_file或Permission denied关键词











