2011-07-01 38 views
4

我正在建立一個簡單的PHP跟蹤像素跟蹤腳本,以下是技術上的工作原理,但是當我看着Safari中的檢查員時,我得到以下警告(1by1.gif是一個42B gif):爲什麼此PHP跟蹤像素無法正常工作?

esource解釋爲文檔,但 與MIME類型圖像/ gif一起傳輸。

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

我看了其他跟蹤像素,他們都展現在檢查,如果他們是實際的圖像,即使使用php擴展。任何想法如何解決該警告?

編輯:

我試着做以下,我也得到了同樣的警告:在你的HTML源

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

您正在使用哪個Web服務器? – webbiedave

+0

Apache,儘管我也使用CloudFlare,並且標題返回爲:服務器:cloudflare-nginx。 –

+0

爲了安全起見,你爲什麼不使用'filesize'而不是文字42?另外,我會用'readfile'替換'echo file_get_contents'。 –

回答

0

這很有趣。如果我刪除內容長度並僅使用以下內容,它看起來可以很好地工作。任何人都知道這可能是爲什麼?

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

我已經用一個假設添加了答案。 – Charles

+1

如果您在[viewheaders.com](http://viewheaders.com/)中輸入網址,長度是否會顯示? 「Transfer-Encoding」? –

+1

而不是'echo file_get_contents'你可能會更好'readfile' – TecBrat

1

你可以寫1x1.gif(或其他一些由名),然後有Apache實際上服務於PHP腳本。你可以用.htaccess沿着線的東西做到這一點:

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

這樣的Safari看到gif擴展,也不會抱怨。

+0

我很確定它不會抱怨擴展,因爲我看到許多其他跟蹤像素使用.php沒有問題。 –

+1

我向上投票並不是因爲它回答了OP的問題,而是因爲它是解決方案的一個很好的補充。 (雖然Apache具體) – TecBrat

0

我很困惑。函數file_get_contents()用於從文本文件獲取內容。你打算在這裏做什麼?該函數以字符串或false返回內容。您的回聲聲明基本上將該結果正確地解釋爲文檔而不是gif。

更新:花了我一段時間,甚至重現這一點,看到警告。回顯file_get_contents()顯示瀏覽器中的gif,一個簡單的include()也會顯示警告。這個警告是否會給你帶來麻煩,或者僅僅是爲了選美比賽?我只能推測Safari的Inspector有點挑剔。 Chrome中的相同工具不會顯示警告。

+0

我覺得這有點奇怪,但這只是我看到幾個說如何做到這一點。你會如何改變它?我意識到這種方法是不正確的,但我不知道如何正確地做到這一點(因此這裏的問題)。 –

+0

@Adrian:只要Content-type頭是正確的,file_get_contents就可以很好地處理圖像。 – webbiedave

+0

我從來沒有做過這樣的事情。我只在二元水平上考慮。 file_get_contents返回一個字符串或false。如果你迴應那個結果,你提交一份文件。如果您將該文檔提交爲image/gif,那麼這是錯誤的。瀏覽器往往是草率和寬容。不過,Safari Inspector注意到了錯誤的類型。 –

0
$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過濾器的步驟。如果代碼沒有這個步驟就能正常工作,那麼錯誤就在那裏。

相關問題