其他答案很好,但是,由于人类似乎确信“任何跟踪都是邪恶的跟踪”,我希望通过保留 .png/@987654324 对用户“不可见”更进一步@/.gif等图片文件扩展名。
我不确定与所有类型的 Web 服务器和主机的兼容性,但对我来说,这是对我在 .htaccess 中已有的 AddHandler 指令的快速更改,例如:
AddHandler application/x-httpd-lsphp .png
...允许处理带有.png 扩展名的文件中的 PHP 代码。
您可能已经有一个AddHandler 行来允许在.htm/.html 文件中使用PHP;如果是这样,只需将适当的图像文件扩展名添加到列表末尾即可。
这大致是我的“跟踪图像”代码、保存为trackimage.png 或其他格式的文件:
<?php //silently log user and return image
$ip=$_SERVER['REMOTE_ADDR'];
$uri=tidy($_SERVER['SCRIPT_URI']);
$querystring=tidy($_SERVER['QUERY_STRING']);
$useragent=tidy($_SERVER['HTTP_USER_AGENT']);
$json = file_get_contents("https://ipinfo.io/".$ip."/geo");
if(($json<>'')&&(strpos($json,"error")===false)){ extract(json_decode($json ,true)); }
$country=tidy($country);
$prov=tidy($region);
$city=tidy($city);
list($lat,$lon)=explode(',',$loc);
$lat=tidy($lat);
$lon=tidy($lon);
$sql = "INSERT INTO img_track_table set ip='$ip', useragent=$useragent, uri=$uri, "
."querystring=$querystring, country=$country, prov=$prov, city=$city, lat=$lat, lon=$lon;";
require 'connect.php'; $conn=new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { /* couldn't connect, but do nothing about it */ }
}else{ //run insert query
if(!$conn->query($sql)) { /* query error, but do nothing about it */ }
$conn->close();
}
//return image
header("Content-Type: image/png");
readfile("myActualImageFile.png");
function tidy($str){ //remove quotes and backslashes from string
if(is_null($str)||($str=="")){return "null";}
$str=trim(str_replace('\\','',str_replace("'","",str_replace('"',"",$str))));
if(is_numeric($str)){return $str;}
return "'$str'";
}
请注意,如果图像之前的代码返回错误文本或其他任何内容,则图像将无法显示。可能还值得研究可能适用于您的情况的可能的安全问题。例如,this。