我有一个服务器,我用来发送电子邮件。 电子邮件有一个图像,用于跟踪他们正在打开,这是forms
<img src="http://tracker.site.com/[email protected]&c=somemd5ishcode">
提供图像的脚本如下所示:
<?php // turn off errors ini_set('display_errors', 0); ini_set('log_errors', 0); // database settings define('DB_HOST','localhost'); define('DB_USER','user'); define('DB_PASSWORD','pass'); define('DB_NAME','db'); // connecting to the db $dbh = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD,true); mysql_select_db(DB_NAME, $dbh); // clean the vars $code = mysql_real_escape_string( $_GET['c'] ); $email = mysql_real_escape_string( $_GET['e'] ); // insert a record if need be if( $code <> '' && $email <> '' ) { // quick debug $dump = ''; foreach( $_SERVER as $k=>$v ) { $dump.= '"'. $k .'" => "'. $v .'",\n'; } mysql_query( "INSERT INTO `tracker_hits` (`CODE_TEXT`,`HIT_EMAIL`,`HIT_IP`,`HIT_TIMESTAMP`,`SERVER_DUMP`) VALUES ('$code','$email','{$_SERVER['REMOTE_ADDR']}','" .time(). "','$dump')", $dbh ); } // disables caching of the image header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); header('Cache-Control: no-cache'); header('Pragma: no-cache'); // outputs a 1x1 transparent PNG header('Content-type: image/png'); echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA')); die();
当我发送电子邮件的时候,我从同一个IP地址获得了几百个点击,但是whois说它属于Mediacom / Verizon / Frontier等等。似乎我的问题可能是一个ISPcaching服务器。 我使用这个网站: http: //redbot.org/来检查我的文件的“caching性”,这就是他们不得不说的:
HTTP/1.1 200 OK Date: Thu, 17 Mar 2011 17:05:20 GMT Server: Apache/2.2.10 (Win32) mod_ssl/2.2.10 OpenSSL/0.9.8i PHP/5.2.6 X-Powered-By: PHP/5.2.6 Expires: Sat, 26 Jul 1997 05:00:00 GMT Cache-Control: no-cache Pragma: no-cache Content-Length: 87 Keep-Alive: timeout=5, max=500 Connection: Keep-Alive Content-Type: image/png
有了这些注释:
General - The Content-Length header is correct. Caching - Pragma: no-cache is a request directive, not a response directive. - This response allows all caches to store it. - This response cannot be served from cache without validation.
所以,我环顾四周,发现我可以使用Apache的expires_module来完成工作,但是当使用以下设置进行设置时,我仍然从REDbot获得相同的结果:
LoadModule expires_module modules/mod_expires.so <IfModule expires_module> ExpiresActive On ExpiresByType text/php A0 ExpiresByType image/png A0 ExpiresByType image/jpg A0 ExpiresByType image/gif A0 </IfModule>
我错过了什么? 我环顾四周,了解PHP header()和<meta>头只用于用户浏览器,而不是ISPcaching。 有一个想法,就是我从组IP打到电子邮件发出后几秒钟内,在我的日志脚本中,我可以检查至less10秒是否已经通过,然后才允许有效。 我认为我可能会遇到的问题虽然是后来当一个人实际上读取电子邮件,ISP不会捕捉请求和短路一个会logging到我的服务器,只是服务他们caching版本?
根据ISP使用的高速caching,您可能有0次强制正确请求而不是高速caching。 即使你指定了诸如mod_expires和nocache之类的东西,ISP仍然可以caching,特别是如果它们运行任何types的代理。
所以:
1.即使您在邮件后等待10秒,您也无法保证正确的客户端视图不会被caching(即,您将看到原始的阻止的ISP视图,但是之后什么也没有)
2.你应该看一个更好的方法,即电子邮件收据。
3.如果你想更新你想达到的目标,如果有限制,我们可以帮助你解决更大的问题。