前言
PHPCMS作为老牌CMS系统,默认设计并未完全兼容HTTPS环境。在生产环境开启SSL证书后,常会出现“重定向次数过多”、“资源加载失败(混合内容)”或“后台无法登录”等报错。本文将提供一套完整的修复方案,涵盖服务器配置、程序代码修改及数据库替换,确保全站无缝切换至HTTPS。
第一步:Web服务器强制HTTPS跳转配置
在修改PHPCMS代码前,必须确保服务器层面已强制将HTTP请求跳转至HTTPS,否则会导致死循环。请根据你的Web服务器环境选择对应配置。
Nginx环境配置
打开Nginx配置文件(通常位于/usr/local/nginx/conf/vhost/你的域名.conf),修改监听80端口的server块,增加跳转规则,并确保443端口配置正确。以下是完整配置代码:
```nginx
server {
listen 80;
server_name yourdomain.com;
强制跳转HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com;
证书路径(请替换为你的实际路径)
ssl_certificate /path/to/your/fullchain.pem;
ssl_certificate_key /path/to/your/privkey.pem;
SSL优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
root /www/wwwroot/yourdomain.com;
index index.php index.html index.htm;
PHPCMS伪静态规则
rewrite ^(.)show-([0-9]+)-([0-9]+)\.html$ $1/show.php?itemid=$2&page=$3;
rewrite ^(.)list-([0-9]+)-([0-9]+)\.html$ $1/list.php?catid=$2&page=$3;
rewrite ^(.)list-([0-9]+)\.html$ $1/list.php?catid=$2;
if (!-e $request_filename) {
rewrite ^(.)$ /index.php last;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
```
Apache环境配置
在网站根目录下的.htaccess文件中添加以下规则。如果文件不存在,请新建一个:
```apache
RewriteEngine On
强制HTTPS跳转
RewriteCond %{HTTPS} off
RewriteRule ^(.)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
PHPCMS伪静态规则
RewriteRule ^(.)show-([0-9]+)-([0-9]+)\.html$ $1/show.php?itemid=$2&page=$3
RewriteRule ^(.)list-([0-9]+)-([0-9]+)\.html$ $1/list.php?catid=$2&page=$3
RewriteRule ^(.)list-([0-9]+)\.html$ $1/list.php?catid=$2
``>
配置完成后,必须重启Web服务 使配置生效。Nginx执行service nginx restart,Apache执行service httpd restart。
第二步:修改PHPCMS全局配置文件
PHPCMS的核心配置文件决定了系统获取的域名协议。如果此处不修改,后台生成的URL依然是HTTP,导致混合内容报错。
修改caches/configs/system.php
使用编辑器打开文件caches/configs/system.php,找到以下配置项进行修改:
找到 'site_url',将其值修改为HTTPS开头的域名。
找到 'https',将其值修改为 1。
修改后的代码片段如下:
```php
'https://yourdomain.com/',
'site_domain' => 'yourdomain.com',
'https' => 1, // 开启HTTPS标识
// ...其他配置...
);
?>
```
第三步:修复系统HTTPS判断逻辑(核心步骤)
这是解决“重定向次数过多”或“后台登录后跳转回首页”的关键。PHPCMS在某些环境下无法正确识别反向代理或负载均衡后的HTTPS状态,需要手动修复代码。
修改phpcms/base.php
打开文件phpcms/base.php,找到 define('APP_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR); 这行代码,在它下面添加 如下代码:
```php
// 强制开启HTTPS支持
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
$_SERVER['HTTPS'] = 'on';
}
```
修改phpcms/modules/admin/classes/admin.class.php
打开文件phpcms/modules/admin/classes/admin.class.php,找到 public function __construct() 构造函数。在函数内部查找登录检查逻辑,确保跳转URL使用HTTPS。建议直接搜索 showmessage 相关的跳转代码,或者在该文件顶部添加如下代码统一处理:
```php
// 修复后台登录跳转协议问题
if (defined('IN_ADMIN') && !defined('HTML')) {
if (pc_base::load_config('system', 'https')) {
$_SERVER['HTTPS'] = 'on';
}
}
``>
第四步:数据库内容批量替换
之前发布文章和内容中存储的图片链接、附件链接可能都是HTTP协议,需要进入数据库进行批量替换。
执行SQL替换命令
进入phpMyAdmin或使用命令行连接数据库,选择PHPCMS使用的数据库,执行以下SQL语句(请将前缀 v9_ 替换为你实际安装时的表前缀,将 yourdomain.com 替换为你的域名):
```sql
-- 替换内容表中的图片及链接地址
UPDATE `v9_page` SET `data` = REPLACE(`data`, 'http://yourdomain.com', 'https://yourdomain.com');
-- 替换标题表中的缩略图(如果有存储绝对路径)
UPDATE `v9_news` SET `thumb` = REPLACE(`thumb`, 'http://yourdomain.com', 'https://yourdomain.com');
UPDATE `v9_picture` SET `thumb` = REPLACE(`thumb`, 'http://yourdomain.com', 'https://yourdomain.com');
UPDATE `v9_download` SET `thumb` = REPLACE(`thumb`, 'http://yourdomain.com', 'https://yourdomain.com');
-- 替换内容详情表中的正文内容
UPDATE `v9_news_data` SET `content` = REPLACE(`content`, 'http://yourdomain.com', 'https://yourdomain.com');
UPDATE `v9_picture_data` SET `content` = REPLACE(`content`, 'http://yourdomain.com', 'https://yourdomain.com');
UPDATE `v9_download_data` SET `content` = REPLACE(`content`, 'http://yourdomain.com', 'https://yourdomain.com');
```
注意: 如果你的网站使用了CDN且图片域名不同,请忽略上述针对图片的SQL,但需确保CDN支持HTTPS访问。
第五步:修复模板中的静态资源调用
PHPCMS模板中使用了 {CSS_URL} 等宏标记,但部分模板可能硬编码了HTTP头,或者JS加载方式不兼容HTTPS。
修改phpcms/templates/default/header.html
打开模板头部文件,检查 和 标签。如果存在 http:// 开头的引用,请删除协议头,使用协议相对路径(即以 // 开头)。
例如:
```html
```
同时,检查模板中是否有调用 site_url($siteid)的地方,确保该函数在开启HTTPS后返回正确的协议。通常修改完 system.php 后此步骤可省略,但为了保险起见,可以在模板中直接使用 https://... 替换部分关键静态资源的调用。
第六步:清除缓存并验证
所有代码和配置修改完成后,必须清除PHPCMS的缓存,否则修改不会生效。
操作步骤
通过FTP或SSH连接服务器,进入网站根目录。
找到 caches 文件夹。
删除 caches 文件夹下的所有文件和文件夹,除了 caches/configs 目录(configs目录存放的是你的配置文件,不要删)。
或者直接在后台登录:点击 “系统设置” -> “系统工具” -> “更新缓存” 。
最终验证
打开浏览器访问 http://yourdomain.com,确认是否自动跳转至 https://yourdomain.com。
按F12打开开发者工具,查看 Console 是否存在“Mixed Content”错误。
点击地址栏左侧的“锁”图标,查看证书连接状态是否为“安全”。
尝试发布一篇包含图片的文章,检查生成的HTML代码中图片路径是否为HTTPS。