
本技术文档专针对部署于西部数码港台虚拟主机或亚数云主机(香港IP)的Discuz、ECSHOP、帝国CMS系统在启用SSL证书并配置301永久跳转后,出现的会员无法登录、后台访问异常等问题提供解决方案。需特别说明,此类主机环境在HTTPS判断机制上存在特殊性,默认的`$_SERVER['HTTPS']`变量支持不足,需通过`$_SERVER['HTTP_FROM_HTTPS']`变量进行兼容性处理,此修改逻辑亦适用于其他基于PHP开发的Web程序。
Discuz系统在部署HTTPS后,后台无法登录的核心原因在于其采用`$_SERVER['HTTPS']`变量进行HTTPS协议状态判断,而目标主机环境对该变量的支持存在局限,导致系统无法正确识别HTTPS连接状态,进而影响用户登录认证及UC通信模块。
修复步骤:
1. 核心判断逻辑修改
文件路径:`source/class/discuz/discuz_application.php`(约188行)
原代码:
```php
$_G['isHTTPS'] = ($_SERVER['HTTPS'] && strtolower($_SERVER['HTTPS']) != 'off') ? true : false;
```
修改为:
```php
$_G['isHTTPS'] = ($_SERVER['HTTP_FROM_HTTPS'] && strtolower($_SERVER['HTTP_FROM_HTTPS']) != 'off') ? true : false;
```
此修改将HTTPS判断依据切换至主机环境支持的`HTTP_FROM_HTTPS`变量,确保系统正确识别HTTPS状态。
2. UC通信协议适配
文件路径:`uc_server/avatar.php`(约14行)
原代码:
```php
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
```
修改为:
```php
define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTP_FROM_HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
```
此处增加`SERVER_PORT`与`HTTP_FROM_HTTPS`的双重判断,确保在301跳转场景下UC通信模块仍能正确调用HTTPS协议,避免通信失败。
特别提示:若采用301方式强制HTTP跳转HTTPS,可能导致UC通信模块因协议判断异常而失效,需同步完成上述变量替换操作。
ECSHOP系统在部署HTTPS后,后台登录失败的原因与Discuz类似,其系统在URL协议判断中依赖`$_SERVER['HTTPS']`变量,而目标主机环境对该变量的支持不足,导致系统生成的登录链接仍为HTTP协议,引发浏览器安全拦截或会话异常。
修复步骤:
文件路径:`includes/cls_ecshop.php`(约154行)
原代码:
```php
return (isset($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://';
```
修改为:
```php
return (isset($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) || (strtolower($_SERVER['HTTP_FROM_HTTPS']) == 'on') ? 'https://' : 'http://';
```
通过增加`HTTP_FROM_HTTPS`变量的判断条件,确保在主机环境特殊情况下,系统仍能正确生成HTTPS协议的登录链接,解决后台无法登录问题。
帝国CMS系统在部署HTTPS后,可能出现后台登录页面空白或登录异常问题,主要因系统在域名协议识别中未适配主机环境的HTTPS判断机制,导致页面生成时协议类型错误。
修复步骤:
1. 7.2及以下版本修复
文件路径:`e/class/connect.php`
修改`eReturnDomain()`函数(约第5-15行):
```php
function eReturnDomain(){
$domain=RepPostStr($_SERVER['HTTP_HOST'],1);
if(empty($domain)){
return '';
}
// return 'http://'.$domain; // 注释原代码,替换为以下逻辑
$httptype = isset($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off') || (strtolower($_SERVER['HTTP_FROM_HTTPS']) == 'on') ? 'https://' : 'http://';
return $httptype.$domain;
}
```
同理修改`FWeReturnDomain()`函数(约第20-30行),替换逻辑与`eReturnDomain()`一致,确保全站域名协议识别正确。
2. 7.5及以上版本修复
配置文件路径:`e/config/config.php`,确保`'httptype' => 0`(开启自动协议识别);
文件路径:`e/class/connect.php`,修改`eCheckUseHttps()`函数(约第5-15行):
```php
function eCheckUseHttps(){
// if($_SERVER['HTTPS']&&strtolower($_SERVER['HTTPS'])!='off') // 注释原代码,替换为以下逻辑
if (isset($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off') || (strtolower($_SERVER['HTTP_FROM_HTTPS']) == 'on'))
{
return 1;
}
else
{
return 0;
}
}
```
此修改确保系统在检测HTTPS状态时兼容主机环境的变量特性,解决登录页面空白问题。
本文针对Discuz、ECSHOP、帝国CMS在西部数码特定主机环境下部署HTTPS后的登录故障,提供了基于`HTTP_FROM_HTTPS`变量的核心修复方案。通过修改各系统的HTTPS判断逻辑,可确保在301跳转场景下协议识别准确,恢复会员登录及后台管理功能。操作前需备份原文件,修改后测试全站HTTPS访问正常性。