觀前提示:修改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';
華為雲:
官方文件:https://support.huaweicloud.com/bestpractice-cdn/cdn_01_0153.html
來自使用者 富貴6868 分享的經驗:
華為雲cdn 要獲取真實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廠商眾多,無法一一列出,且這部分功能還需要進一步的完善
如果遇到使用此教程後仍然無法獲取到真實IP的問題可以回帖詢問
配置好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的方式修改成自己需要的值(上面沒改過的則不用管)