本文目录导读:

通常情况下,纯后端逻辑的PHP代码不需要修改,SSL证书的部署主要是Web服务器(如Nginx、Apache)或负载均衡器的配置变更,PHP本身并不直接处理SSL/TLS加密。
根据你的项目架构和代码中资源引用的方式,前端资源(HTML/JS/CSS)和API请求的URL可能需要进行调整,以避免出现“混合内容”(Mixed Content)错误。
以下是需要检查或修改的几个关键点:
绝对路径与相对路径(最常见情况)
- 问题: 如果你的代码中给用户返回的HTML页面里,引用了CSS、JS、图片等资源,或者API请求的地址写死了
http://协议,浏览器会因为安全策略阻止这些非加密的请求。 - 解决方案:
- 使用相对路径(推荐): 将
http://example.com/css/style.css改为/css/style.css或//example.com/css/style.css(协议相对路径)。 - 使用动态协议: 在PHP中,根据请求的协议动态生成URL。
// 检测当前请求是否为HTTPS $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $baseUrl = $protocol . '://' . $_SERVER['HTTP_HOST'];
- 使用相对路径(推荐): 将
cURL/HTTP请求(后端代码调用外部API)
-
问题: 你的PHP代码(如使用
curl、file_get_contents、Guzzle等)向自己的其他内部服务或外部API发起了http://请求。 -
解决方案:
- 内部通信: 如果服务都在同一台机器或内网,建议保持
http://(避免SSL性能损耗)或改为http://,但如果这些服务也强制HTTPS,则需要改为https://。 - 外部API: 如果调用的外部API已经支持HTTPS,请将URL改为
https://。
示例(cURL):
// 原来 $url = 'http://api.example.com/data'; // 改为 $url = 'https://api.example.com/data'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 如果是自签名证书或内部测试,可能需要禁用SSL验证(生产环境请勿使用) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch);
- 内部通信: 如果服务都在同一台机器或内网,建议保持
数据库或配置文件中存储的URL
- 问题: 数据库里存储了完整的
http://地址(例如用户头像URL、文章中的图片链接)。 - 解决方案:
- 数据库查询时处理: 在输出时用PHP替换协议
str_replace('http://', 'https://', $url)。 - 批量更新数据库: 直接执行SQL
UPDATE table SET url = REPLACE(url, 'http://', 'https://') WHERE url LIKE 'http://%'。 - 存储相对路径: 这是最佳实践,只存
/uploads/avatar.jpg,显示时加上协议和域名。
- 数据库查询时处理: 在输出时用PHP替换协议
重定向与强制HTTPS(推荐)
虽然不属于“改代码”,但这是部署SSL后最关键的一步,通常通过Web服务器配置(而不是PHP代码)来实现,但PHP代码也可以处理。
- Web服务器配置(推荐): 在Nginx或Apache中设置重定向。
- Nginx:
return 301 https://$host$request_uri; - Apache:
RewriteEngine On+RewriteCond规则。
- Nginx:
- PHP代码中强制(备选):
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') { $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; header('HTTP/1.1 301 Moved Permanently'); header('Location: ' . $redirect); exit(); }
安全头信息(HSTS)
- 可选但重要: 部署SSL后,可以在HTTP响应头中添加
Strict-Transport-Security,告诉浏览器以后强制使用HTTPS访问,可以在PHP中设置或在Web服务器配置中设置。header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
你需要检查的清单
- HTML页面中的资源引用:
<link>,<script>,<img>,<iframe>有没有写死http://?(改为相对路径或https://)。 - JavaScript中的API请求:
fetch()或XMLHttpRequest里的URL有没有写死http://? - PHP后端发的请求:
curl_init或file_get_contents里的URL是否要改成https://? - 是否存储了
http://的绝对路径?需要替换。 - 重定向逻辑: 确保HTTP访问会自动跳转到HTTPS。
如果项目之前已经是全站HTTPS,只是换了个新证书,代码通常不需要改,如果你是刚开启HTTPS,那么重点排查前端的资源加载和后端调用的API地址。