php本身不处理ssl证书,配置https关键在web服务器(nginx/apache):①加载证书并启用443端口;②正确透传https状态至php,确保$_server['https']==='on';③本地开发须用mkcert生成含san的证书;④出站https请求需配置cacert.pem。

PHP本身不处理SSL证书,配置HTTPS的关键在Web服务器(Nginx或Apache)——PHP只是被动接收服务器传来的加密状态。配错地方,$_SERVER['HTTPS']永远为空,重定向打转、混合内容报错、锁图标不显示,全都会发生。
Web服务器必须加载证书并启用443端口
PHP不读fullchain.pem或privkey.pem,这些文件只被Nginx/Apache用于TLS握手。漏掉任一环节,HTTPS就无法响应:
- Nginx:
server块里必须有listen 443 ssl,且ssl_certificate和ssl_certificate_key路径要绝对准确,权限为600(尤其privkey.pem) - Apache:确认
a2enmod ssl已执行,SSLEngine on在VirtualHost *:443内,且SSLCertificateFile指向fullchain.pem(不是cert.pem),SSLCertificateKeyFile指向privkey.pem - 配置后务必运行
nginx -t或apachectl configtest验证语法,再systemctl reload,别跳过
PHP必须能识别当前是HTTPS请求
服务器配置证书只是第一步;若PHP收不到“这是HTTPS”的信号,header('Location: https://...')可能无限循环,setcookie(..., true)的Secure标志也不生效:
- Nginx:在
fastcgi_param中加fastcgi_param HTTPS on(不能写fastcgi_param HTTPS "on",引号会导致PHP收到字符串"on"而非布尔真值) - Apache:用
SetEnvIf或RewriteRule设置环境变量,例如SetEnvIf X-Forwarded-Proto https HTTPS=on,或直接在VirtualHost里写SetEnv HTTPS on - 验证方式:在PHP里打印
var_dump($_SERVER['HTTPS']),应输出string(2) "on",不是""、"1"或false
cURL或file_get_contents访问外部HTTPS接口时证书验证失败
这不是Web服务器问题,而是PHP发起出站请求时缺少可信CA根证书,典型错误是cURL error 60或SSL certificate problem:
- 下载最新
cacert.pem(从https://curl.se/ca/cacert.pem),存到固定路径如/etc/php/cacert.pem - 在
php.ini中设curl.cainfo = "/etc/php/cacert.pem",并确保extension=openssl已启用 - 代码中临时指定(不推荐长期用):
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem'),但绝不要设CURLOPT_SSL_VERIFYPEER为false - 注意:自签名API服务需额外把它的证书加入
cacert.pem,或用CURLOPT_SSL_VERIFYHOST配合CURLOPT_SSL_VERIFYPEER精细控制
本地开发用https://localhost打不开或提示不安全
浏览器现在拒绝不含subjectAltName(SAN)的证书,用openssl req -x509手动生成的证书基本无效:
- 必须用
mkcert(v1.4.8+)生成:先mkcert -install注入根证书,再mkcert localhost 127.0.0.1 ::1 - 生成的
localhost+3.pem和localhost+3-key.pem放进Apache/Nginx配置指定路径,别用localhost.crt这种老命名 - Apache需确认
httpd.conf里Include conf/extra/httpd-ssl.conf已取消注释,且httpd-ssl.conf中VirtualHost *:443的DocumentRoot指向正确目录 - Windows/macOS用户常忽略“以管理员身份运行”
mkcert -install,导致根证书未进系统信任库,浏览器仍报错
最容易被忽略的是中间证书链缺失和$_SERVER['HTTPS']的真假判断逻辑——前者让锁图标变黄,后者让所有基于协议的PHP判断失效。别只盯着证书文件放对没放对,得一路验到PHP变量里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











