近期log有挂着百度头的访问疯狂get图片,css,js导致服务器负载居高不下 。把一个图片更名后,404也get个没完没了。由于公司网站是经别人的服务器反向代理后的。apache的访问log里只能看到代理服务器的ip.根本无从查看访问的实际ip地址。
于是,查方法。
一,apache 生成日志时的方法,试了不管用,显示两个ip 但都是服务器的。
方法:https://blog.csdn.net/xingnang2008/article/details/84846781
如果实在不行,可以试试,万一行了呢。
二,路由 + 页面 +php +ajax
- 把一个图片更名后,在thinkphp 的路由里把图片的访问指向一个写好的方法。
- 方法里写php获取真实ip地址的方法。取到后ajax 发到服务器,服务器接收保存。
public function index(){
$ip = $this->get_client_ips();
}
//取到ip
function get_client_ips($type=0){
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL)
return $ip[$type];
if ($_SERVER['HTTP_X_REAL_IP']) {
// nginx代理模式下,获取客户端真实IP
$ip = $_SERVER['HTTP_X_REAL_IP'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
// 客户端的ip
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
// 浏览当前页面的用户计算机的网关
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown', $arr);
if (false !== $pos)
unset($arr[$pos]);
$ip = trim($arr[0]);
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR']; // 浏览当前页面的用户计算机的ip地址
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
// IP地址合法验证
$long = sprintf("%u", ip2long($ip));
$ip = $long ? array(
$ip,
$long
) : array(
'0.0.0.0',
0
);
$res_ip = $ip[$type];
$this->gets($res_ip);
}
//发送ip
function gets($ip){
$curl = curl_init();
$url="http://www.****.com/portal/test/recives";
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//设置post数据
$post_data = array(
"ip" => $ip
);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//显示获得的数据
}
//接收ip
public function recives(){
$ip = I("post.ip");
$time = date("Y-m-d H:i:s", time());
file_put_contents(SITE_PATH."/public/temp/log.txt",$time." : ".$ip, FILE_APPEND);
}