为什么这个PHP跟踪像素不能正常工作


Why does this PHP tracking pixel not working correctly?

我正在用PHP设置一个简单的像素跟踪脚本,下面的脚本在技术上可行,但当我在Safari中查看检查器时,我会收到以下警告(1by1.gif是42B gif(:

资源被解释为文档,但是使用MIME类型的image.gif传输。

header("Content-type: image/gif");
header("Content-Length: 42");
echo file_get_contents("/path/to/1by1.gif");
// do tracking stuff below here

我已经查看了其他跟踪像素,它们在检查器中都显示为实际图像,即使扩展名为.php。有什么办法解决这个警告吗?

编辑:

我试着做了以下操作,得到了同样的警告:

header("Content-type: image/gif");
$img = imagecreatefromstring(file_get_contents("/path/to/1by1.gif"));
imagegif($img);

您可以在HTML源代码中编写1x1.gif(或其他虚构的名称(,然后让Apache实际提供PHP脚本。你可以用.htaccess做这件事,用一些类似的东西:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^1x1'.gif$ tracking_script.php [NC,L]

这样Safari就可以看到gif扩展并且不会抱怨。

这很有趣。如果我去掉内容长度,只使用以下内容,它似乎可以完美地工作。有人知道为什么会这样吗?

header("Content-type: image/gif");
echo file_get_contents("/path/to/1by1.gif");
// do tracking stuff below here

我很困惑。函数file_get_contents((用于从文本文件中获取内容。你在这里的意图是什么?函数以字符串或false的形式返回内容。您的echo语句本质上传递的结果被正确地解释为文档,而不是gif。

更新:我花了一段时间才复制并看到警告。响应file_get_contents((确实会在浏览器中显示gif,简单的include((也会显示警告。这个警告会给你带来麻烦吗?还是只是为了参加选美比赛?我只能推测Safari的检查员有点挑剔。Chrome中的相同工具不会显示警告。

$img = imagecreatefromstring(file_get_contents("/path/to/1by1.gif"));
imagegif($img);

此代码

  1. 读取GIF图像
  2. 将图像字节传递给GD
  3. 要求GD写入一个新图像

这里可能会出很多问题。例如,将图像写回可能不会产生完全相同的字节流,可能更多,也可能更少。这可能会使您的Content-Length标头无效,并且浏览器不喜欢您在此类内容上撒谎。或者在其中一行中可能有一个通知或警告,它将作为GIF数据之前的内容发出。这肯定会让看起来像一个"文档",而不是Webkit的图像数据。

通过file_get_contents/include/echo服务文件通过GD步骤消除了过滤器。如果代码在没有该步骤的情况下正常工作,那么错误就在某个地方。