如何使用Location头来使HTTP缓存失效?

3
在HTTP规范中,关于缓存过期的处理方式如下:cache invalidation
引用如下:

有些HTTP方法必须使缓存失效一个实体。这实体可以是由请求URI引用的,或者是Location或Content-Location头引用的实体(如果存在)。

我试图通过使用位置(Location)头来使我的缓存项无效,但它似乎并没有起作用。以下是我的用例:
  1. 15:13:23.9988 | GET | folders/folder.34/contents - 200 (OK)
  2. 15:13:24.1318 | PUT | folders/folder.34/contents/test.docx - 201 (已创建)
  3. 15:13:24.1548 | GET | folders/folder.34/contents - 200 (OK) (已缓存)
响应(2)包含一个带有在请求(1)和(3)中使用的URI的位置(Location)头。我相信这应该使得folders/folder.34/contents的缓存条目无效,但是根据HttpWebResponse.IsFromCache属性,响应(3)似乎仍然来自缓存。
我尝试了许多位置(Location)头中的URI格式,包括:
  • Location: ../../../folders/folder.34/contents (以及其他各种'../'计数)
  • Location: folders/folder.34/contents
  • Location: /folders/folder.34/contents
  • Location: http://myhostname/folders/folder.34/contents
但是响应(3)总是从缓存中获取。我在这里做错了什么?
1个回答

4

HTTPBis更清晰明了:

https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p6-cache-22#section-6

Because unsafe request methods (Section 4.2.1 of [Part2]) such as
PUT, POST or DELETE have the potential for changing state on the
origin server, intervening caches can use them to keep their contents
up-to-date.

A cache MUST invalidate the effective Request URI (Section 5.5 of
[Part1]) as well as the URI(s) in the Location and Content-Location
response header fields (if present) when a non-error response to a
request with an unsafe method is received.

如果您没有看到这种行为,我的假设只是您使用的特定HTTP客户端没有正确的行为。
我特别期望:
Location: /folders/folder.34/contents

要具有正确的行为。


WinInet缓存(例如IE,.NET)不表现出正确的行为,这是否可信? - ladenedge
@ladenedge: 当然;) HTTP相当复杂,任何客户端都会有一些漏洞。此外,我认为你刚刚证明了这一点。问题是:你是否犯了错误,认为你的软件堆栈是不可错的,忽略了自己的逻辑? ;) - Evert
虽然这似乎是基本的,但(哭泣)。无论如何,感谢您的帮助! - ladenedge
我几乎整天都在处理HTTP和阅读/实现rfcs。我很确定我从来没有意识到这是一个要求。但这非常有用!我想知道其他客户端做得如何。 - Evert

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