我正在用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);
此代码
- 读取GIF图像
- 将图像字节传递给GD
- 要求GD写入一个新图像
这里可能会出很多问题。例如,将图像写回可能不会产生完全相同的字节流,可能更多,也可能更少。这可能会使您的Content-Length
标头无效,并且浏览器不喜欢您在此类内容上撒谎。或者在其中一行中可能有一个通知或警告,它将作为GIF数据之前的内容发出。这肯定会让看起来像一个"文档",而不是Webkit的图像数据。
通过file_get_contents
/include
/echo
服务文件通过GD步骤消除了过滤器。如果代码在没有该步骤的情况下正常工作,那么错误就在某个地方。