0

背景

Magento 的产品详细信息页面可在 catalog/product/view/id/{product_id} 访问。它很快就被托管在 magento 云上。有不同的客户群,每个客户群可以在产品详情页面上看到不同的价格。我通常会打开两个选项卡,在一个选项卡上,我将注销属于与客户组 A 关联的客户的帐户,然后登录到属于与客户组 B 关联的客户的帐户。每次我这样做,我需要做的就是刷新包含产品详细信息页面的第二个选项卡,价格就会改变。这很好,这是预期的行为

问题

我现在处于一种情况,我需要能够在后端的 Magento 管理表单中从某个客户组中删除对产品的访问权限,一旦完成,属于该客户组的客户应该不再是假设页面已经在他/她的浏览器中打开,则能够在刷新后访问前端的该产品页面。事实证明这很难做到。

请注意,此代码在我的开发环境中有效,并且 Varnish 也已启用并在我的开发环境中有效。快速似乎只是在 magento 云暂存环境中缓存不同。

我做过的事情

我通过添加一个实现Magento\Framework\DataObject\IdentityInterface. 此标签是客户组 ID 和对正在加载的产品的访问状态的串联。如果访问被撤销,状态为 0,否则状态为 1。

我添加了一个before插件Magento\Framework\App\Http\Context::getVaryString(),这个before插件还添加了客户组 ID 和访问状态的相同连接。我相信这就是唯一标识页面的每个缓存版本的速度。

这些都没有奏效。

我的问题

如果在我切换用户帐户时快速运行良好,为什么在需要考虑其他上下文时它不能运行?

在将页面提供给网络用户之前,如何快速检查用户是否仍然有权访问该产品页面?

如何快速知道当前用户会话何时发生变化?也许我可以应用相同的方法来撤销访问权限。

4

1 回答 1

0

如果在我切换用户帐户时快速运行良好,为什么在需要考虑其他上下文时它不能运行?

我建议查看HTTP 响应标头,因为这些标头将向 Fastly 指示如何缓存页面。

通常,对于个人用户独有的内容,Cache-Control将发送一个响应标头,其中包含一个值,该值指示下游 CDN 不应缓存该内容。

这意味着当您注销一个用户帐户然后登录另一个用户帐户时,用户的帐户页面将发送类似Cache-Control: private.

请参阅 Fastly 的文档以防止内容被缓存

在将页面提供给网络用户之前,如何快速检查用户是否仍然有权访问该产品页面?

我建议联系 support@fastly.com,其客户支持团队将能够帮助您进行调试,但我想这与 Fastly 被指示缓存相关产品页面的方式有关。

您应该检查 HTTP 响应以查看它是被客户端(即用户的浏览器)还是被下游缓存(例如 Fastly)缓存。

您也许可以利用Surrogate-Key响应标头来标记特定产品页面,然后为相关键发出缓存清除。

如何快速知道当前用户会话何时发生变化?也许我可以应用相同的方法来撤销访问权限。

Fastly 不知道用户的会话何时更改。Fastly 被指示从其缓存中提供页面,或者如果缓存为空或内容已被标记为“私有”(即对用户而言是唯一的),则从源获取内容。

发送特定页面(例如用户的帐户页面)时可能会带有Cache-Control: private响应标头,以指示不应缓存内容。

我建议在这里联系 support@fastly.com 以获得最佳方法,但如上所述,您也许可以使用Surrogate-Key.

于 2021-12-02T09:54:46.227 回答