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

6
有没有一种方式(一个HTTP标头),可以告诉浏览器在缓存时不区分 main.cssmain.css?someparam=1
根据w3c规范
由于一些应用程序传统上使用GET和HEAD与包含查询URL的rel_path部分的URL(其中包含“?”)执行具有重大副作用的操作,因此缓存对此类URI的响应除非服务器提供显式到期时间否则不得视为新鲜的。这特别意味着来自HTTP / 1.0服务器的此类URI的响应不应从缓存中获取。
我的Firefox 3.5.5会重新从服务器获取文件,如果GET参数更改。如果不变,则从缓存中提供内容。(通过FireBug进行验证)
那么,有没有一种方法来处理这个问题(而不是删除GET参数)?

3
你为什么要发送这个参数,如果你打算忽略它并提供相同的副本呢? - Anon.
这是与服务器上的对话范围使用相关的编程内容,且该参数是会话框架(MyFaces Orchestra for JSF in this case)所必需的。 - Bozho
这实际上是由框架附加的,即使我有控制权,它也会破坏对话功能。 - Bozho
好的,那为什么不使用POST呢?或者只需始终提供相同的页面并在用户cookie中跟踪更改的值即可? - Conspicuous Compiler
如果您真的完全不控制框架,您可能可以使用Web服务器将查询重写为没有参数的303请求的URL。结合使用JavaScript在提交之前将相关参数保存到Cookie中,然后在页面加载时提取这些参数,也许您会做得很好? - Conspicuous Compiler
2个回答

3

不太清楚URL参数应该由哪一方提供:服务器还是客户端?无论如何,您的服务器可以这样做,以便客户端处理相同的URL,并且不需要任何不存在的魔术标头。 ;)

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

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

重写引擎还有其他功能,您甚至可以通过cookies传递参数,并在RewriteCond行中提取它们到查询字符串中:

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

这样客户端的URL将保持不变。

如果客户端需要带参数发送请求,并且不能用其他方式实现,您可以进行外部重定向并设置一个cookie:

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

这样浏览器就会考虑是否缓存不带参数的URL。阅读Rewrite Engine文档,其中还有其他有用的功能。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接