问题标签 [vary]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1498 浏览

cdn - 如何确保我的 CDN 按来源缓存 CORS 请求?

我目前使用 Akamai 作为我的应用程序的 CDN,该应用程序通过多个子域提供服务。

我最近意识到 Akamai 以相同的方式缓存 CORS 请求,无论请求的来源如何。

Origin这当然会导致发出与缓存响应不同的请求的客户端失败(因为它们的响应标头Access-Control-Allow-Origin与应有的不同)

许多人建议提供Vary: Origin请求标头以避免此问题,但根据 Akamai 的文档此 Akamai 社区帖子,这不受 Akamai 支持。

Origin如果Origin请求中存在标头,我如何强制 Akamai 以唯一方式缓存内容?

0 投票
1 回答
145 浏览

http - 我应该指定“Vary: If-None-Match, If-Modified-Since”吗?

RFC 7231

响应中的“Vary”标头字段描述了
请求消息的哪些部分,除了方法、主机标头字段和
请求目标之外,可能会影响源服务器
选择和表示此响应的过程。

0 投票
0 回答
201 浏览

cookies - 如何配置 Varnish 根据 Vary 响应标头有条件地忽略 cookie?

我正在使用 Varnish 3 缓存来自使用 Edge Side Includes (ESI) 的 Web 应用程序的响应。

来自 ESI 端点的响应通常有两种类型:

  • 有些是特定于身份验证的,因此使用响应Vary: Cookie, Accept-Encoding
  • 无论cookies如何,一些都会为所有用户缓存,因此响应Vary: Accept-Encoding(不因cookie而异)

所有请求都包含Cookie带有各种 cookie 的标头。没有标头的请求以Cookie响应Set-Cookie。请注意,来自例如 Google Analytics 的 - 前缀 cookie 不是这种情况__- 这些是由旧应用程序设置的 cookie,我无法更改此行为。

有没有办法*配置 Varnish 3 以记住来自各个 ESI 端点的响应不会因 cookie 而异,因此未来的请求应该Cookie完全忽略标头并使用缓存的响应而不是从后端获取新的响应?

(*) 除了将 URI 硬编码到 Varnish 配置中之外,我正在寻找一种方法让 Varnish 尊重包含 cookieVary的请求的cookie 标头。

0 投票
1 回答
657 浏览

apache - 如何添加不同的自定义标题

我的应用程序正在根据用户国家代码更改内容。

服务器请求流

https 请求 -> nginx 处理 ssl 终止 -> varnish -> 如果没有缓存,则从 apache 获取内容

http rquest -> varnish -> 重定向到 https 链接 -> nginx 处理 ssl 终止 -> varnish -> 如果未缓存则从 apache 获取内容

使用清漆 GeoIP 模块,我找到了用户国家代码并将值设置为req.http.X-Country-Code我在应用程序中读取此标头值的标头。

问题:它总是缓存第一个命中并服务于所有位置

我希望添加不同的标题可以解决我的问题,你能指导我吗?

我不确定在哪里添加不同的标头 nginx 或 apache。

0 投票
1 回答
197 浏览

.net - .net core UseResponseCompression 在放置 Vary 标头值时与 ResponseCache 属性冲突

我通过调用 app.UseResponseCompression() 在我的 .Net Core API 应用程序中使用响应压缩中间件。但是在我的 API 控制器操作之一中,我还使用了 ResponseCache 属性并将其设置为 VaryByHeader = Authorization 但我得到的响应仅获得标题 Vary: "Accept-Encoding" 这似乎是由响应压缩中间件。如果我删除中间件,则会出现 Vary: Authorization ,所以我猜测中间件与 ResponseCache 属性冲突。

我如何能够在可变标头上获得授权,同时仍然能够使用响应压缩中间件?

0 投票
2 回答
631 浏览

cookies - 谷歌云 CDN 变化:cookie 响应永远不会被缓存命中

我正在使用 Google Cloud CDN 缓存 HTML 页面。

我已经根据文档配置了所有正确的标题,并且页面缓存很好。现在,我想更改它,使其仅在请求没有 cookie 时缓存,即没有cookie设置标头。

我的理解是,这只是更改我的源服务器以向页面的所有vary: cookie响应添加标头,然后仅添加缓存标头并且在请求上没有设置标头的情况。Cache-Control: publicCache-Control: max-age=300cookie

但是,这不起作用。使用curl我可以看到,vary: cookie当我发送带有和不带有 cookie 的请求时,所有缓存标头(标头)都按预期设置,但我从来没有在没有 cookie 的请求上获得缓存命中。

深入研究 Cloud CDN 日志,我看到每个没有cookie标头的请求都cacheFillBytes填充了与响应大小相同的数字 - 而不是针对cookie标头设置了值的请求(如预期的那样)。

因此,看起来 Cloud CDN 正在尝试按预期填充没有 cookie 的请求的缓存,只是我从来没有收到缓存命中- 即cacheFillBytes每次都cacheHit: true没有出现在日志中。

有没有人遇到过类似的事情?我已经三重检查了我所有的标头是否有错别字,实际上只是删除vary: cookie标头就可以使缓存按预期工作,所以我几乎可以肯定我的配置在标头和 Cloud CDN 认为可缓存的内容方面是正确的。

Cloud CDN 是否应该vary: cookie像我期望的那样处理?文档建议它处理任意变化的标头。如果是这样,为什么我会cacheFillBytes每个请求上看到Cache-Control: publicCache-Control: max-age=300设置响应,但cacheHit: true在任何后续请求中都curl看不到 a正在填充几个不同的边缘缓存)?

0 投票
1 回答
67 浏览

wcf - 具有输出缓存配置文件集的 WCF 服务不同:* 标头

我有一个 WCF 服务,它使用 OutputCacheProfile 来获得一小时的输出缓存时间

输出缓存有效,但响应包含 header Vary: *,这会阻止浏览器使用缓存的响应。我相信我遇到了这里描述的错误: https ://topic.alibabacloud.com/a/introduction-to-an-outputcache-bug-that-accompanied-asp-net-from-10-to-40_1_36_32422553.html 解决方法是调用Response.Cache.SetOmitVaryStar(true); ,除非在我的情况下我有 WCF 服务并且不知道如何在该上下文中使用解决方法

有什么方法可以为 WCF 服务调用 SetOmitVaryStar() 吗?还有其他解决方法吗?

我尝试以编程方式设置可变标头:

但它没有效果

在 OutputCacheProfile 中设置 location="ServerAndClient" 也无济于事。

我正在考虑使用 Web API 控制器并使用它: https ://github.com/filipw/Strathweb.CacheOutput但这是最​​后的手段。

更新

我尝试了下面丁鹏的建议,并BeforeSendReply尝试使用代码删除可变标头:

然而,vary * 标头仍然出现在响应中,就好像输出缓存机制在此之后将其添加回来一样。

0 投票
0 回答
23 浏览

caching - 即使可变标头匹配,浏览器 cache.match() 也会意外失败

在 Chrome 90 上(我在 MacOS 上试过),当我CacheStorage使用

这可以按预期工作,我从开发工具中进行了交叉检查。

但是当我尝试取回响应时

它失败并返回undefined

很明显,匹配失败是由于vary标题(按设计我想设置ignoreVary: false,顺便说一句,这也是默认选项)。

以下两个匹配尝试都按预期通过

第一个请求也应该匹配,因为x-a标头设置为abc.

我在这里做错了什么?

0 投票
0 回答
47 浏览

rest - 仅当 X-Auth-Token 相同时才对经过身份验证的 REST api 请求进行 HTTP 缓存

我正在使用此客户端服务器端向多个用户的第三方服务发出请求。它适用于 1 个用户。每个请求都使用相同的参数到达一个端点,但每个请求的标头之一是X-Auth-Token,第三方使用它来区分发出请求的用户。由于 ACLing/Access,每个用户都可能得到不同的响应。

我希望 Cache 考虑X-Auth-Token到,所以只有在相同的情况下才会返回相同的响应X-Auth-Token。但是,在初始请求之后,它会向每个用户返回相同的结果。

我如何确保X-Auth-Token在缓存时考虑到它,或者有没有办法可以将用户名编码到每个缓存的请求中?

我可以Vary以某种方式使用标题吗?

0 投票
0 回答
60 浏览

azure - 减少 Azure 存储服务 Rest API 的预检请求数

我正在使用Azure Blob Rest API在 Azure Blob 存储中上传我的文件。我将我的文件分成多个块并使用Put Block rest API 逐个上传所有块。有时,如果文件超过 1 GB,我必须进行 100 多次 API 调用才能完全上传文件。

我注意到在每次 API 调用之前,浏览器都会发送一个预检请求。我已将“Access-Control-Max-Age”标头设置为 3600,但 chrome 继续忽略它。

经过一番研究,我发现浏览器不会缓存对 put 请求的响应,而Put Block REST API 实际上是一个 PUT 请求,这就是为什么每次调用之前都会发出预检请求的原因。

有解决这个问题的方法吗?在每次调用之前发送预检请求太昂贵并且会影响性​​能。