
本技術文檔專針對部署于西部數碼港臺虛擬主機或亞數云主機(香港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訪問正常性。