HTTP缓存控制和参数顺序

5
为什么浏览器会缓存数据,只有当url的查询参数按照相同顺序时才不会向服务器发送请求?
例如,如果发送到如下请求:
/product?q=phone&cat=1
响应头中包含了Cache-Control:max-age=60,那么下一个请求:
/product?cat=1&q=phone 虽然被发送到服务器,但是应该从缓存中检索数据。
此外,一些框架建议:
如果您正在缓存使用大量查询字符串参数的请求,请考虑对它们进行排序,以确保请求被正确缓存。通过对参数进行排序,您可以确保缓存键在请求之间保持一致,并且您正在有效地缓存数据。

这与服务器端逻辑有关。您需要检查为什么一个请求中存在 Cache-Control 标头而另一个请求中不存在。 - shaochuancs
1
我已经更新了。问题是为什么第二个请求没有从缓存中检索数据? - Romper
2个回答

8

HTTP并没有定义查询参数的语法。因此,从缓存的角度来看,这些URL可能会识别出不同的内容。


3
根据HTTP RFC,缓存的主键是URI:
引用如下: 主要缓存键由请求方法和目标URI组成。但是,由于今天常见的HTTP缓存通常仅限于缓存对GET的响应,因此许多缓存只是拒绝其他方法并且仅使用URI作为主缓存键。
因此,所有与缓存相关的头:Cache-Control、Expires、ETag等都基于一个前提条件:相同URL的资源。

查询参数是否被视为URL或URI的一部分? - user1663023
1
查询参数的字符被视为URI的一部分。然而,正如Julian Reschke所述,它只被视为普通字符。 - shaochuancs

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