1.DZ 論壇可能無法獲得使用者的真實 IP
2. 論壇訪問量過大的話,可能會導致使用者訪問時提示 「抱歉,您的 IP 地址不在被允許,或您的賬號被停用,無法訪問本站點」
原因:
使用 CDN,對於網站訪客來說,相當於使用了代理訪問,而 DZ 在設計上,是優先獲取代理 IP,其它才會檢測代理伺服器是否將使用者真實 IP 傳輸過來,也就是說獲取代理 IP 優先於使用者真實 IP 。如果您的網站不需要對使用者訪問做過多的限制,強烈建議按照以下方法進行:
解決方法 (DZ X2 為例):
開啟 DZ /source/class/class_core.php 檔案
找到第 341 行,或者搜尋 「HTTP_CLIENT_IP」,找到如下程式碼:
- if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match(『/^([0-9]{1,3}.){3}[0-9]{1,3}$/』, $_SERVER['HTTP_CLIENT_IP'])) {
- $ip = $_SERVER['HTTP_CLIENT_IP'];
- } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND
preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'], - if (isset($_SERVER['HTTP_CLIENT_IP']) &&
preg_match(『/^([0-9]{1,3}.){3}[0-9]{1,3}$/』,
$_SERVER['HTTP_CLIENT_IP'])) { $ip =
$_SERVER['HTTP_CLIENT_IP']; }
elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND
preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'],
方法 1:
將以上程式碼修改為:
- if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])
AND preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'], - if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND
preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'],
方法 2:
臨時註釋部分程式碼,也就是比原來的程式碼多了二對註釋符 (/*和*/) 即將上面的程式碼修改成:
- /*
- if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match(『/^([0-9]{1,3}.){3}[0-9]{1,3}$/』, $_SERVER['HTTP_CLIENT_IP'])) {
- $ip = $_SERVER['HTTP_CLIENT_IP'];
- } else
- */
- if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND
preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'], - /*
- if (isset($_SERVER['HTTP_CLIENT_IP']) &&
preg_match(『/^([0-9]{1,3}.){3}[0-9]{1,3}$/』,
$_SERVER['HTTP_CLIENT_IP'])) { $ip =
$_SERVER['HTTP_CLIENT_IP']; }else - */
- if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND
preg_match_all(『#d{1,3}.d{1,3}.d{1,3}.d{1,3}#s』,
$_SERVER['HTTP_X_FORWARDED_FOR'],
以上操作後,登陸 CDN 和你的 Discuz! 論壇後臺分別清除快取即可。
備註:部分版本的 Discuz! 該檔案中可能有區別,