1. 程式人生 > 實用技巧 >使用CDN後如何配置Apache使其記錄訪客真實IP

使用CDN後如何配置Apache使其記錄訪客真實IP

今天想看看哪些地區的人訪問過我的網站,於是開啟Apache網站響應日誌,把訪客IP複製到百度,發現搜到的全部都是我是用的CDN的節點IP,真實的訪客IP並沒有被記錄。

如圖所示,上面的103.45.78.85還有58、122段全部都是CDN節點的IP,真實訪問者的IP一個都沒有記錄下來。

一、除錯

於是獲取了一下伺服器接收到的請求頭,新建一個request.php檔案放到網站根目錄,內容如下:

<?php $headers = apache_request_headers(); foreach ($headers as $header => $value) { echo "$header: $value <br />\n";
} ?>

然後訪問https://wuter.cn/request.php,出現了下面這個錯誤。

根據內容大概能判斷是因為apache_request_headers()這個函式沒有被定義,但是php手冊說是支援這個函式的。

沒辦法,既然沒定義那就在呼叫之前定義一下,已經php是世界上最好的程式語言(梗)。

定義如下:

<?php if (!function_exists('apache_request_headers')) { eval(' function apache_request_headers() { foreach($_SERVER as $key=>$value) {
if (substr($key,0,5)=="HTTP_") { $key=str_replace(" ","-",ucwords(strtolower(str_replace("_"," ",substr($key,5))))); $out[$key]=$value; } } return $out; } '); } ?>

二、解決方法

這時訪問https://wuter.cn/request.php已經能夠成功顯示請求頭了,複製如下:

Accept-Language: zh-CN,zh;q=0.9
X-Forwarded-For: 171.43.251.197
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
X-Edge-Retry-Times: -
Cookie: __cfduid=d31ec109277e7f67c282c6336c8a83a3b1597994775; mp_a36067b00a263cce0299cfd960e26ecf_mixpanel=%7B%22distinct_id%22%3A%20%221743aa1b561296-022e8eee62b6b5-376b4502-1fa400-1743aa1b5628a0%22%2C%22%24device_id%22%3A%20%221743aa1b561296-022e8eee62b6b5-376b4502-1fa400-1743aa1b5628a0%22%2C%22%24initial_referrer%22%3A%20%22https%3A%2F%2Fwuter.cn%2Fwp-admin%2Fedit.php%22%2C%22%24initial_referring_domain%22%3A%20%22wuter.cn%22%7D; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_4b895119d7c61df7bd4d354ad8fcdfdc=admin%7C1599035914%7CTnFr34eVmo45MRlZ9QD8IpGwOF9yaQBTvNWFxXvsm36%7Cf0b77a434e8a2fc726a517dff72e27ea96bb2a591c1466be5e50a79bfd1b72e7; wp-settings-1=libraryContent%3Dbrowse%26mfold%3Do%26cats%3Dpop; wp-settings-time-1=1598863115
Sec-Fetch-Mode: navigate
Client-Ip: 171.43.251.197
X-Via: shanks/0.10.18
Sec-Fetch-Site: same-origin
If-None-Match:
X-Request-Id: e7414229e9435c528a4ec3a8df091b1f
Upgrade-Insecure-Requests: 1
X-Real-Ip: 171.43.251.197
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
X-Route-Via: V.mix-js-czx2-048, S.mix-js-czx2-046
Host: wuter.cn

發現其中X-Forwarded-For: 171.43.251.197記錄的就是我的真實IP,所以把這個新增到 Apache的配置檔案http.conf。搜尋logformat找到下面這行.

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

將其改為:

LogFormat "real-ip:%{X-Forwarded-For}i cdn-ip:%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

三、測試

現在訪問日誌已經可以同時記載訪客真實IP和給訪客提供服務的CDN節點IP。

備註:如果訪客使用代理訪問,可能無法獲取真實地址。