是否有一种方法(http标头)告诉浏览器在执行缓存时不要区分main.css
和main.css?someparam=1
。
根据w3c spec:
由于某些应用程序传统上使用带有查询URL的GET和HEAD(在rel_path部分中包含“?”)以执行具有重大副作用的操作,因此除非服务器提供明确的到期时间,否则缓存不得将对此类URI的响应视为新的。这特别意味着HTTP / 1.0服务器对此类URI的响应不应该从缓存中获取
如果GET参数发生变化,我的Firefox 3.5.5会从服务器重新获取文件。如果它没有改变,它将从缓存中服务内容。 (用FireBug验证过。)
那么,有没有办法解决这个问题(不删除get参数)。
答案 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