在PHP环境中部署了SSL证书并且网站已经可以通过HTTPS访问,但浏览器地址栏仍然提示不安全,这是很多开发者和运维人员都会遇到的问题。造成这种现象的原因往往不在于证书没有生效,而是页面内容或通信协议存在隐患。

一、全站资源加载中的混合内容
当主页面通过HTTPS加载,但页面中引用了HTTP协议的图片、CSS、JavaScript或接口地址时,浏览器就会判定为混合内容(Mixed Content)。如果其中包含被动混合内容,部分浏览器会显示警告;若是主动混合内容(如脚本),现代浏览器会直接拦截并提示不安全。
在PHP项目中,资源地址常常写死在模板或配置里。可以用下面简单的PHP脚本扫描输出内容中是否含有http://开头的资源链接:
<?php
// 假设$html是渲染后的页面内容
$html = file_get_contents('https://ipipp.com/page.html');
// 匹配页面中的http://资源引用
if (preg_match_all('/http://[^"'s]+/', $html, $matches)) {
echo "发现未加密资源:n";
foreach ($matches[0] as $url) {
echo $url . "n";
}
} else {
echo "未检测到HTTP资源n";
}
?>
常见需要修正的位置
- 模板文件中的 <img src="http://..."> 或 <script src="http://...">
- PHP配置文件里写死的静态资源域名
- 数据库中存储的旧文章图片地址
- 前端AJAX请求使用的HTTP接口
二、SSL协议版本过低
即使全站资源都是HTTPS,如果服务器启用了已被废弃的TLS1.0或TLS1.1,Chrome等浏览器也会标记连接为不安全。需要在Web服务器和PHP通信层明确限定协议版本。
Nginx中限定TLS版本
server {
listen 443 ssl;
server_name ipipp.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 仅允许TLS1.2和TLS1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
}
Apache中限定TLS版本
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
# 禁用TLS1.0和TLS1.1
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
三、PHP自身的HTTPS感知
有些PHP程序依靠 $_SERVER['HTTPS'] 来判断当前协议,如果反向代理或负载均衡没有正确传递该变量,程序可能生成HTTP链接。可以在入口文件强制修正:
<?php
// 当外层代理已开启HTTPS时,强制识别
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
?>
四、快速自查清单
| 检查项 | 处理方式 |
|---|---|
| 页面含HTTP资源 | 替换为相对协议或HTTPS地址 |
| TLS版本过低 | 配置SSL_protocol_version为TLS1.2+ |
| 代理未传HTTPS头 | 在PHP中补全$_SERVER['HTTPS'] |
| 证书域名不匹配 | 更换覆盖所用域名的证书 |
通过上述排查,基本可以解决PHP环境下开启HTTPS却提示不安全的绝大多数情况。核心思路就是保证全站资源加密且协议版本符合现代浏览器要求。
PHPHTTPSSSL_protocol_version修改时间:2026-07-27 21:36:22