问题标签 [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.
cdn - 如何确保我的 CDN 按来源缓存 CORS 请求?
我目前使用 Akamai 作为我的应用程序的 CDN,该应用程序通过多个子域提供服务。
我最近意识到 Akamai 以相同的方式缓存 CORS 请求,无论请求的来源如何。
Origin
这当然会导致发出与缓存响应不同的请求的客户端失败(因为它们的响应标头Access-Control-Allow-Origin
与应有的不同)
许多人建议提供Vary: Origin
请求标头以避免此问题,但根据 Akamai 的文档和此 Akamai 社区帖子,这不受 Akamai 支持。
Origin
如果Origin
请求中存在标头,我如何强制 Akamai 以唯一方式缓存内容?
http - 我应该指定“Vary: If-None-Match, If-Modified-Since”吗?
响应中的“Vary”标头字段描述了
请求消息的哪些部分,除了方法、主机标头字段和
请求目标之外,可能会影响源服务器
选择和表示此响应的过程。
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 标头。
apache - 如何添加不同的自定义标题
我的应用程序正在根据用户国家代码更改内容。
服务器请求流
https 请求 -> nginx 处理 ssl 终止 -> varnish -> 如果没有缓存,则从 apache 获取内容
http rquest -> varnish -> 重定向到 https 链接 -> nginx 处理 ssl 终止 -> varnish -> 如果未缓存则从 apache 获取内容
使用清漆 GeoIP 模块,我找到了用户国家代码并将值设置为req.http.X-Country-Code
我在应用程序中读取此标头值的标头。
问题:它总是缓存第一个命中并服务于所有位置
我希望添加不同的标题可以解决我的问题,你能指导我吗?
我不确定在哪里添加不同的标头 nginx 或 apache。
.net - .net core UseResponseCompression 在放置 Vary 标头值时与 ResponseCache 属性冲突
我通过调用 app.UseResponseCompression() 在我的 .Net Core API 应用程序中使用响应压缩中间件。但是在我的 API 控制器操作之一中,我还使用了 ResponseCache 属性并将其设置为 VaryByHeader = Authorization 但我得到的响应仅获得标题 Vary: "Accept-Encoding" 这似乎是由响应压缩中间件。如果我删除中间件,则会出现 Vary: Authorization ,所以我猜测中间件与 ResponseCache 属性冲突。
我如何能够在可变标头上获得授权,同时仍然能够使用响应压缩中间件?
cookies - 谷歌云 CDN 变化:cookie 响应永远不会被缓存命中
我正在使用 Google Cloud CDN 缓存 HTML 页面。
我已经根据文档配置了所有正确的标题,并且页面缓存很好。现在,我想更改它,使其仅在请求没有 cookie 时缓存,即没有cookie
设置标头。
我的理解是,这只是更改我的源服务器以向页面的所有vary: cookie
响应添加标头,然后仅添加缓存标头并且在请求上没有设置标头的情况。Cache-Control: public
Cache-Control: max-age=300
cookie
但是,这不起作用。使用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: public
并Cache-Control: max-age=300
设置响应,但cacheHit: true
在任何后续请求中都curl
看不到 a正在填充几个不同的边缘缓存)?
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 * 标头仍然出现在响应中,就好像输出缓存机制在此之后将其添加回来一样。
caching - 即使可变标头匹配,浏览器 cache.match() 也会意外失败
在 Chrome 90 上(我在 MacOS 上试过),当我CacheStorage
使用
这可以按预期工作,我从开发工具中进行了交叉检查。
但是当我尝试取回响应时
它失败并返回undefined
。
很明显,匹配失败是由于vary
标题(按设计我想设置ignoreVary: false
,顺便说一句,这也是默认选项)。
以下两个匹配尝试都按预期通过
第一个请求也应该匹配,因为x-a
标头设置为abc
.
我在这里做错了什么?
rest - 仅当 X-Auth-Token 相同时才对经过身份验证的 REST api 请求进行 HTTP 缓存
我正在使用此客户端服务器端向多个用户的第三方服务发出请求。它适用于 1 个用户。每个请求都使用相同的参数到达一个端点,但每个请求的标头之一是X-Auth-Token
,第三方使用它来区分发出请求的用户。由于 ACLing/Access,每个用户都可能得到不同的响应。
我希望 Cache 考虑X-Auth-Token
到,所以只有在相同的情况下才会返回相同的响应X-Auth-Token
。但是,在初始请求之后,它会向每个用户返回相同的结果。
我如何确保X-Auth-Token
在缓存时考虑到它,或者有没有办法可以将用户名编码到每个缓存的请求中?
我可以Vary
以某种方式使用标题吗?
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 请求,这就是为什么每次调用之前都会发出预检请求的原因。
有解决这个问题的方法吗?在每次调用之前发送预检请求太昂贵并且会影响性能。