如何指示浏览器在缓存资源时忽略GET参数

时间:2009-12-09 22:21:12

标签: http firefox caching

是否有一种方法(http标头)告诉浏览器在执行缓存时不要区分main.cssmain.css?someparam=1

根据w3c spec

由于某些应用程序传统上使用带有查询URL的GET和HEAD(在rel_path部分中包含“?”)以执行具有重大副作用的操作,因此除非服务器提供明确的到期时间,否则缓存不得将对此类URI的响应视为新的。这特别意味着HTTP / 1.0服务器对此类URI的响应不应该从缓存中获取

如果GET参数发生变化,我的Firefox 3.5.5会从服务器重新获取文件。如果它没有改变,它将从缓存中服务内容。 (用FireBug验证过。)

那么,有没有办法解决这个问题(不删除get参数)。

2 个答案:

答案 0 :(得分:3)

目前还不清楚哪一方需要URL中的参数:服务器或客户端?无论如何,您的服务器可以表现得客户端处理相同的URL并且不需要任何不存在的魔术头。 ;)

如果服务器需要params,则可以使用Apache URL重写添加该参数(如果使用Apache:

RewriteRule ^style.css$ /style.css?param=1 [L]

还有Rewrite Engine可以做的其他事情,你甚至可以通过cookie传递params并将它们在RewriteCond行中提取到查询字符串中:

RewriteCond %{HTTP_COOKIE} a:(.*) # not sure of the syntax
RewriteRule ^style.css$ /style.css?a=%1 [L]

这样,客户端的URL将是相同的。

如果客户端使用params发送请求,并且它无法以不同的方式工作,则可以设置外部重定向并设置cookie:

RewriteCond %{QUERY_STRING} a=(.*)
RewriteRule ^(.*)$ /$1 [CO=a:%1:mysite.com,R]

这样浏览器会考虑缓存/不缓存没有任何参数的URL。阅读Rewrite Engine docs,还有其他有用的功能。

答案 1 :(得分:0)

自Apache 2.2.6起,您可以使用CacheIgnoreQueryString directive

上的CacheIgnoreQueryString