鴻茂傳媒經營理念
始終以創造客戶價值為根本
景安/西部/騰訊雲/阿里雲
提供大廠商的雲伺服器
16年網絡運維經驗
提供專屬人工技術服務
觀前提示:修改discuz不是獲取真實ip的最佳方法
如果您有能力,建議了解apache mod_remoteip、nginx ngx_http_realip_module 或其他同類功能
在伺服器端配置可以讓你的伺服器訪問日誌也能收集到正確的ip
參照此教程修改之前,請務必確認x3.5當前是否能夠獲取到真實的ip地址
如果已經能獲取到真實ip地址的情況下,切勿參照此教程修改!
首先打開 config/config_global.php 這個文件,找到這樣一行:
$_config['security']['onlyremoteaddr'] = 1;
將1改成0
然後到大約最下面的位置,找到這樣一段:
//------------------------- config ipgetter --------------------------//
$_config['ipgetter']['setting'] ='';
$_config['ipgetter']['header']['header'] =' http_x_forwarded_for'
將其中的
$_config['ipgetter']['setting'] ='';
改成
$_config['ipgetter']['setting'] =' header';
(如果已經是header了就不用改了)
對於許多cdn來說,做到這一步就已經能獲取到真實ip了,可以試一下。
在做完上一步的前提之下,如果你的cdn屬於以下範圍,可以進一步參考以下內容嘗試進行修改,並觀察獲取到的ip
按下述方法進一步修改後往往能得到正確或者更準確的結果
(以下信息均來自於各大廠商官方文檔,是否可用需要看廠商文檔的準確程度,建議修改後自行測試)
需要修改的是這一行:
$_config['ipgetter']['header']['header'] =' http_x_forwarded_for';
cloudflare:
改成
$_config['ipgetter']['header']['header'] =' http_cf_connecting_ip';
阿里雲:
方案1:改成
$_config['ipgetter']['header']['header'] =' http_ali_cdn_real_ip';
方案2:
(這個視情況修改,不一定可用)
https://help.aliyun.com/document_detail/155768.html
參考此文章最下面的配置示例二
配置場景:在回源頭裡面添加客戶端真實ip信息,給源站傳遞客戶端ip地址信息。
配置方法:
自定義請求頭名稱:x-real-ip。
請求頭參數:$remote_addr。
配置後,將上述行改成
$_config['ipgetter']['header']['header'] =' http_x_real_ip';
騰訊云:
https://cloud.tencent.com/document/product/228/45078
參考此文章進行修改騰訊雲的配置
頭部參數設置為:x-client-ip
頭部取值設置為:$client_ip
配置後,將上述行改成
$_config['ipgetter']['header']['header'] =' http_x_client_ip';
又拍雲:
改成
$_config['ipgetter']['header']['header'] =' http_x_real_ip';
fastly:
改成
$_config['ipgetter']['header']['header'] =' http_fastly_client_ip';
azure:
改成
$_config['ipgetter']['header']['header'] =' http_x_azure_clientip';
由於cdn廠商眾多,無法一一列出,且這部分功能還需要進一步的完善
配置好discuz部分並可以順利正常使用以後,如果您的站點沒有使用獨立模式的話,還需要對ucenter server也進行相應的配置。
到 uc_server/data/config.inc.php 文件當中找到如下一段:(使用自定義路徑uc的需要將uc_server換成自己真正的uc位置)
(早期x3.5版本可能沒有,沒有可以在文件結尾自行加上)
define('uc_onlyremoteaddr', 1);
define('uc_ipgetter',' header');
define('uc_ipgetter_header', serialize(array('header' =>'http_x_forwarded_for')));
將uc_onlyremoteaddr那行的1改成0即可。
uc_ipgetter_header那行的http_x_forwarded_for,也可以按照上面修改discuz的方式修改成自己需要的值(上面沒改過的則不用管)
特別安全提示:
$_config['security']['onlyremoteaddr'] = 1;
配置文件中的這一行,改成0以後絕對要仔細檢查ipgetter是否正確填寫
如果忘了寫雖然也可以讓你獲取到用戶ip,但會導致網站無條件信任用戶端傳來的ip信息
黑客可以藉機將自己的ip偽造成任意值,對你的站點安全會造成很大的影響!
這一點務必注意!
------------------------
經過鴻茂傳媒測試:部分用戶修改上面代碼後,測試註冊論壇帳號後發現,依然用戶註冊的ip還是cdn的ip顯示。
打開網站目錄:/source/class/discuz/discuz_application.php 文件,找到return $ip;方法,如下:
替換以下代碼
if (isset($_server['http_x_real_ip'])){
$ip = $_server['http_x_real_ip'];
}
return $ip;
修改以上代碼後,去後台更新緩存,並重新在測試註冊帳號是否是本地ip了。
© 網站版權與免責聲明
1、【鴻茂傳媒】獨立擁有本網站相關網頁內所有資料的版權;
2、未經【鴻茂傳媒】的明確書面許可,任何人不得對其進行複製;
3、本網站未註明【鴻茂傳媒】的文章,均來源於網絡,僅供大家學習與參考;
4、如有侵權/違規/不妥請聯繫客服qq或郵箱刪除,敬請諒解;
5、【鴻茂傳媒】保留隨時更正、修改、更新本聲明的權利。法律申明