Управление кешем PHP - возможно ли избежать ЛЮБОГО подключения к одному и тому же URL из браузера? - PullRequest
0 голосов
/ 09 ноября 2010

Можно ли вообще избежать каких-либо подключений из браузера, если правильно заданы заголовки первого ответа?

/* Caching control */
$age = 3600*24*30; // 30 days
header('Expires: ' . gmdate('D, d M Y H:i:s ', time() + $age) . 'GMT');

Я пытался настроить это, но запрос все равно достигает сервера.

Я нашел это:

Преимущество заголовка Expires заключается в том, что его легко реализовать;в большинстве случаев, однако, если вы не очень организованный человек, вы не будете точно знать, когда будет обновлена ​​данная страница на вашем сайте.Поскольку браузер будет связываться с сервером только после истечения срока действия страницы, нет способа сообщить браузерам, что страница, которую они кэшировали, устарела.Кроме того, вы также теряете некоторую информацию о трафике, посещающем ваш веб-сайт, поскольку браузер не будет связываться с сервером при запросе кэшированной страницы.

Вопрос в том, почемуЗаголовок Expires, который я упоминал выше, не работает?

** Заголовки запроса **

GET /ru/templates/bannerpartial HTTP/1.1
Host: 192.168.1.3
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.12) Gecko/20101026 AlexaToolbar/alxf-1.54 Firefox/3.6.12 FirePHP/0.4
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: bla-bla-bla
Cache-Control: max-age=0

** Заголовки ответа **

HTTP/1.1 200 OK
Date: Tue, 09 Nov 2010 16:48:26 GMT
Server: Apache/2.2.14 (Unix) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
Expires: Thu, 09 Dec 2010 16:48:26 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 118
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Ответы [ 2 ]

3 голосов
/ 13 ноября 2010

Файл .htaccess проще использовать со следующими настройками:

<ifModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault "access plus 1 seconds"
    ExpiresByType text/html "access plus 10 seconds"
    ExpiresByType image/gif "access plus 31536000 seconds"
    ExpiresByType image/jpeg "access plus 31536000 seconds"
    ExpiresByType image/png "access plus 31536000 seconds"
    ExpiresByType image/ico "access plus 86400 seconds"
    ExpiresByType image/x-icon "access plus 86400 seconds"
    ExpiresByType text/css "access plus 31536000 seconds"
    ExpiresByType text/javascript "access plus 31536000 seconds"
    ExpiresByType application/javascript "access plus 31536000 seconds"
    ExpiresByType application/x-javascript "access plus 31536000 seconds"
    ExpiresByType application/x-shockwave-flash "access plus 31536000 seconds"
<FilesMatch "\.(flv|gif|jpg|jpeg|png|ico)$">
   Header set Cache-Control "max-age=31536000"
</FilesMatch>

AddType image/vnd.microsoft.icon .ico
ExpiresByType image/vnd.microsoft.icon "access plus 1 months"

</ifModule>

Если он не работает, раскомментируйте следующую строку в файле Apache httpd.conf (большинство хост-серверов включают этот модульпо умолчанию):

LoadModule expires_module modules/mod_expires.so

Срок действия заголовка истекает, только если вы нажмете на ссылку или выберите строку браузера в браузере и нажмете клавишу Enter.Если вы нажмете кнопку перезагрузки (или нажмете F5), браузер проигнорирует заголовок expires и перезагрузит содержимое.

0 голосов
/ 13 ноября 2010

Попробуйте cache-control: max-age.См. Это руководство для деталей: http://www.mnot.net/cache_docs/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...