[英]How does Fastly Caching know when user session has changed in Magento 2 Commerce
背景
Magento 的产品详细信息页面可在目录/产品/视图/id/{product_id} 访问。 它很快就被托管在 magento 云上。 有不同的客户群,每个客户群可以在产品详情页面上看到不同的价格。 我通常会打开两个选项卡,在一个选项卡上,我将注销属于与客户组 A 关联的客户的帐户,然后登录到属于与客户组 B 关联的客户的帐户。每次我这样做,我需要做的就是刷新包含产品详细信息页面的第二个选项卡,价格就会改变。 这很好,这是预期的行为
问题
我现在处于一种情况,我需要能够在后端的 Magento 管理表单中从某个客户组中删除对产品的访问权限,一旦完成,属于该客户组的客户应该不再是假设页面已经在他/她的浏览器中打开,则能够在刷新后访问前端的该产品页面。 事实证明这很难做到。
请注意,此代码在我的开发环境中有效,并且 Varnish 也已启用并在我的开发环境中有效。 快速似乎只是在 magento 云暂存环境中缓存不同。
我做过的事情
我通过添加一个实现Magento\Framework\DataObject\IdentityInterface
的块将我自己的附加标签添加到 X-Magento-Tag 。 此标签是客户组 ID 和对正在加载的产品的访问状态的串联。 如果访问被撤销,状态为 0,否则状态为 1。
我在Magento\Framework\App\Http\Context::getVaryString()
中添加了一个before
插件,这个before
插件还添加了相同的客户组 ID 和访问状态的串联。 我相信这就是唯一标识页面的每个缓存版本的速度。
这些都没有奏效。
我的问题
如果在我切换用户帐户时快速运行良好,为什么在需要考虑其他上下文时它不能运行?
在将页面提供给 web 用户之前,如何快速检查用户是否仍然有权访问该产品页面?
如何快速知道当前用户 session 何时发生变化? 也许我可以应用相同的方法来撤销访问权限。
如果在我切换用户帐户时快速运行良好,为什么在需要考虑其他上下文时它不能运行?
我建议查看HTTP 响应标头,因为这些标头将指示 Fastly 如何缓存页面。
通常,对于个人用户独有的内容,将发送一个Cache-Control
响应 header,其中的值指示下游 CDN 不应缓存该内容。
这意味着当您注销一个用户帐户然后登录另一个用户帐户时,用户的帐户页面将发送类似Cache-Control: private
内容。
请参阅 Fastly 的文档以防止内容被缓存。
在将页面提供给 web 用户之前,如何快速检查用户是否仍然有权访问该产品页面?
我建议联系 support@fastly.com,其客户支持团队将能够帮助您调试此问题,但我想这与 Fastly 被指示缓存相关产品页面的方式有关。
您应该检查 HTTP 响应以查看它是否被客户端(即用户的浏览器)或下游缓存(例如 Fastly)缓存。
您也许可以使用Surrogate-Key
响应 header 来标记特定产品页面,然后为相关键发出缓存清除。
如何快速知道当前用户 session 何时发生变化? 也许我可以应用相同的方法来撤销访问权限。
Fastly不知道用户的session什么时候变了。 Fastly 要么被指示从其缓存中提供页面,要么在缓存为空或内容已被标记为“私有”(即用户唯一)时从源获取内容。
特定页面(例如用户的帐户页面)很可能通过Cache-Control: private
响应 header 发送,以指示不应缓存内容。
我建议在这里联系 support@fastly.com 以获得最佳方法,但如上所述,您也许可以使用Surrogate-Key
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.