Discuz! X3.5 針對常見CDN/WAF/負載均衡,如何獲取真實IP?

木子欢儿發表於2024-06-12
觀前提示:修改Discuz不是獲取真實IP的最佳方法
如果您有能力,建議瞭解Apache mod_remoteip、Nginx ngx_http_realip_module 或其他同類功能
在伺服器端配置可以讓你的伺服器訪問日誌也能收集到正確的IP

參照此教程修改之前,請務必確認X3.5當前是否能夠獲取到真實的IP地址
如果已經能獲取到真實IP地址的情況下,切勿參照此教程修改!

首先開啟 config/config_global.php 這個檔案,找到這樣一行:

  1. $_config['security']['onlyremoteaddr'] = 1;
複製程式碼


將1改成0

然後到大約最下面的位置,找到這樣一段:

  1. // ------------------------- CONFIG IPGETTER -------------------------- //
  2. $_config['ipgetter']['setting'] = '';
  3. $_config['ipgetter']['header']['header'] = 'HTTP_X_FORWARDED_FOR';
複製程式碼



將其中的

  1. $_config['ipgetter']['setting'] = '';
複製程式碼


改成

  1. $_config['ipgetter']['setting'] = 'header';
複製程式碼


(如果已經是header了就不用改了)

對於許多CDN來說,做到這一步就已經能獲取到真實IP了,可以試一下。

在做完上一步的前提之下,如果你的CDN屬於以下範圍,可以進一步參考以下內容嘗試進行修改,並觀察獲取到的IP
按下述方法進一步修改後往往能得到正確或者更準確的結果
(以下資訊均來自於各大廠商官方文件,是否可用需要看廠商文件的準確程度,建議修改後自行測試)

需要修改的是這一行:

  1. $_config['ipgetter']['header']['header'] = 'HTTP_X_FORWARDED_FOR';
複製程式碼



Cloudflare:
改成

  1. $_config['ipgetter']['header']['header'] = 'HTTP_CF_CONNECTING_IP';
複製程式碼



阿里雲:
方案1:改成

  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。

配置後,將上述行改成

  1. $_config['ipgetter']['header']['header'] = 'HTTP_X_REAL_IP';
複製程式碼



騰訊雲:
https://cloud.tencent.com/document/product/228/45078
參考此文章進行修改騰訊雲的配置
頭部引數設定為:X-Client-IP
頭部取值設定為:$client_ip

配置後,將上述行改成

  1. $_config['ipgetter']['header']['header'] = 'HTTP_X_CLIENT_IP';
複製程式碼



華為雲:
官方文件:https://support.huaweicloud.com/bestpractice-cdn/cdn_01_0153.html
來自使用者 富貴6868 分享的經驗:

華為雲cdn 要獲取真實IP 需要去開工單 單獨域名每個配置 已經配置好了 也獲取到了 特此說明


又拍雲:
改成

  1. $_config['ipgetter']['header']['header'] = 'HTTP_X_REAL_IP';
複製程式碼



Fastly:
改成

  1. $_config['ipgetter']['header']['header'] = 'HTTP_FASTLY_CLIENT_IP';
複製程式碼



Azure:
改成

  1. $_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版本可能沒有,沒有可以在檔案結尾自行加上)

  1. define('UC_ONLYREMOTEADDR', 1);
  2. define('UC_IPGETTER', 'header');
  3. define('UC_IPGETTER_HEADER', serialize(array('header' => 'HTTP_X_FORWARDED_FOR')));
複製程式碼



將UC_ONLYREMOTEADDR那行的1改成0即可。
UC_IPGETTER_HEADER那行的HTTP_X_FORWARDED_FOR,也可以按照上面修改Discuz的方式修改成自己需要的值(上面沒改過的則不用管)

相關文章