CDN 上的服务器端渲染问题

red*_* 87 8 javascript node.js server-side-rendering

我最近推出了一个使用服务器端渲染(使用 next.js)的网站。该站点具有登录功能,如果存在来自用户请求的身份验证 cookie,那么它将在服务器上为该用户呈现登录视图,并将呈现的登录视图返回给用户浏览器。如果用户没有身份验证 cookie,那么它会在服务器上呈现一个已注销的视图并将其返回给用户浏览器。

目前它工作得很好,但我在尝试通过 CDN 为网站提供服务时遇到了障碍。我的问题是 CDN 将缓存服务器响应以加快速度,因此第一个访问 CDN 上的网站的用户将缓存其登录视图并返回到浏览器。这反过来意味着,因为它被缓存,所以访问该站点的其他用户也会看到其他用户登录的视图,而不是他们自己的,因为这是 CDN 缓存的内容。不理想。

我正在努力思考解决这个问题的最佳方法是什么。想听听有关解决此问题的最佳实践方法的任何建议吗?

我想到的一种方法是可能总是在第一次访问页面时返回注销的视图请求,因此在客户端进行身份验证/登录,从那时起始终在服务器上进行身份验证。但是,如果 next.js 仅在第一个请求上进行服务器端渲染,并且让后续请求在客户端上进行所有渲染,则此方法仅适用,我不确定是否是这种情况。

谢谢,并会喜欢我能得到的所有帮助/建议!

更新

从到目前为止我从答案中收集到的信息看来,解决这个问题的最佳方法是在每个用户第一次访问该站点时为他们提供一个 CDN 缓存的注销视图。如果他们的 cookie 中存在身份验证令牌,我可以从前端手动登录他们。他们登陆的第一页之后的所有页面都必须返回登录的视图 - Next.js 是否可能?这是一个很好的方法吗?以下是这些步骤的摘要:

  1. 用户登陆任何网页
  2. 向服务器发出该页面以及用户 cookie 的请求。
  3. 因为这是他们访问的第一个页面,所以 cookie 将被忽略,并且“注销”视图将返回给用户浏览器(已缓存在 CDN 中)
  4. 然后前端加载一个登出的视图。加载后,它会检查身份验证令牌,如果存在,则调用 API 以登录它们
  5. 之后的任何其他页面导航都作为“登录”视图从服务器返回(即这次不会忽略身份验证 cookie)。这避免了必须再次执行第 4 步,这会让用户在每个页面上都感到厌烦。

Ank*_*van -1

我从您的问题中了解到,当用户登录时,登录视图会缓存在 CDN 上,当用户注销时,站点也会显示在 CDN 缓存的登录视图中。

对于这个问题有一些解决方案如下:

  1. 为CDN设置一些TTL(Time To Live),以便在特定时间后自动使缓存数据失效。
  2. 当您想要快速交付网站时,意味着您想要实现低延迟。为此,您可以做一件事,只需将网站中的大文件(如图像、视频、文档等)缓存到 CDN 即可。并且不要在那里缓存整个网站。现在,每次用户请求到来时,都会从常规服务器提供站点服务,并从 CDN 获取媒体文件。通过这种方式,您可以实现低延迟。由于媒体文件是从 CDN 缓存中获取的,因此网站代码将快速加载,并且网站将快速提供服务。这样,认证就会在服务器端完成。
  3. 另一种解决方案是在一段不活动时间后使 cookie 和身份验证失效。之后,当用户到来时,网站应该呈现一个注销视图。