2010-11-09 43 views
0

如果第一个响应标头设置正确,是否可以避免来自浏览器的任何连接?PHP缓存控制 - 可以避免从浏览器连接到相同的URL?

/* 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 
+1

您问是否可以避免*第二个*请求?您显然至少需要一个请求,以便您可以发送有问题的头文件。除此之外,它取决于浏览器。用户可能已完全禁用缓存。你可以做的最好的是提供哪些内容应该被缓存,哪些不应该。 – meagar 2010-11-09 15:34:42

+0

如何在PHP中正确设置Expire头文件,以避免** ** **客户端的第二次请求**谢谢;) – Somebody 2010-11-09 15:38:14

+0

请发布您发送的所有标题(从实际的HTML)。同时发布客户端在第二个请求中发送的标头。此外,我的水晶球正在眨眼,所以让我们知道您使用的HTTP服务器和版本。 – 2010-11-09 16:03:12

回答

3

它更容易使用.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 

只有当您点击链接或选择浏览器的URL栏并按Enter键才会使标题有效。如果按下重新加载按钮(或按F5键),浏览器将忽略过期标题并重新加载内容。