Назад | Перейти на главную страницу

Отключить (ISP) кеширование - WAMP

У меня есть сервер, который я использую для отправки писем. У писем есть изображение, которое используется для отслеживания их открытия, то есть в виде

<img src="http://tracker.site.com/index.php?e=test@site.com&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 / и т. Д. Я огляделся и похоже, что моя проблема может быть связана с кеш-сервером ISP. Я использовал этот сайт: http://redbot.org/ чтобы проверить "кешируемость" моего файла, и вот что они сказали:

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.

Итак, я огляделся и обнаружил, что я предположительно могу использовать модуль expires_module Apache для выполнения работы, но при настройке со следующими настройками я все еще получаю те же результаты от 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()s и <meta> заголовки используются только для браузера пользователя, а не для кеша интернет-провайдера. Одна мысль, которая у меня возникла, заключалась в том, что, поскольку все IP-обращения группы происходят в течение нескольких секунд после отправки электронного письма, в моем сценарии журнала я мог проверить, прошло ли хотя бы 10 секунд, прежде чем разрешить попадание быть действительным. Проблема, с которой, как я полагал, я могу столкнуться, заключается в том, что позже, когда человек фактически физически читает электронное письмо, не сможет ли провайдер перехватить запрос и не закоротит ли тот, который зарегистрировал бы попадание на мой сервер, и просто не будет обслуживать его. версия кеша?

В зависимости от кэширования, которое использует провайдер, у вас может быть 0 шансов принудительно выполнить правильный запрос, а не кэшировать. Даже если вы укажете такие вещи, как mod_expires, nocache и т. Д., Интернет-провайдеры все равно могут кэшировать, особенно если они используют какой-либо прокси.

Так:
1. даже если вы подождете 10 секунд после отправки почты, вы не можете гарантировать, что правильное представление клиента не будет кэшировано (т.е. вы увидите исходное заблокированное представление ISP, но затем ничего после)
2. Вам следует выбрать лучший метод, например, электронные квитанции.
3. Если вы хотите обновить то, чего хотите достичь, и если есть ограничения, мы, вероятно, сможем решить вашу более серьезную проблему.