今天想看看哪些地区的人访问过我的网站,于是打开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 "real-ip:%{X-Forwarded-For}i cdn-ip:%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined三、测试
现在访问日志已经可以同时记载访客真实IP和给访客提供服务的CDN节点IP。
备注:如果访客使用代理访问,可能无法获取真实地址。