SSR-当页面来自缓存时,状态代码301丢失(总是返回200)



我们目前在SSR优化引擎方面存在问题。这种情况是,产品在目录上被删除或重命名,用户倾向于直接访问旧的、不存在的URL。然后,我们实现了一个重定向行为,发送状态代码301,这样客户就可以重定向到相关页面,在该页面上,其URL是从BE检索到的。(通过通用HTTP拦截器catchError(

catchError((error: any) => {
if (error instanceof HttpErrorResponse) {
...
this.response.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
this.response.set('location',this.service.urlBuilder(redirectUrl));
return this.setMovedPermanentlyStatus();
}
}

然而,我们也缓存了这些页面,所以下次页面来自缓存时,它会返回200,而不是我们最初尝试实现的301。我们试图排除那些有301的人不会被像对待其他人一样对待,但当他们来自缓存时,它仍然会返回200。(通过扩展SSR优化引擎,但有一个例外,如(

protected fallbackToCsr(response: Response, filePath: string, callback: SsrCallbackFn): void {
if (response.statusCode !== HttpResponseStatus.MOVED_PERMANENTLY) {
response.set('Cache-Control', 'no-store');
callback(undefined, this.getDocument(filePath));
}
}

我们正在寻找一种解决方案,以确保所有"重定向页面"总是以301而不是200响应,即使它们来自缓存。

通过扩展SSR优化的引擎

您是如何扩展(和使用(优化的引擎的?我对此很好奇,因为在我看来,实例是硬编码的(而不是注入的(,就像这样:

// apply optimization wrapper if optimization options were defined
return optimizationOptions
? new OptimizedSsrEngine(engineInstance, optimizationOptions)
.engineInstance
: engineInstance;

如果你真的设法使用了自己的优化引擎实例,那么你可以这样做:覆盖renderResponse

protected renderResponse(
filePath: string,
options: any,
callback: (err?: Error | null, html?: string) => void
): void {
super.renderResponse(filePath, options, callback);
const response: Response = options.res || options.req.res;
if (response.statusCode === HttpResponseStatus.MOVED_PERMANENTLY) {
// remove the result from cache so that it's executed again
const request: Request = options.req;
const key = this.getRenderingKey(request);
this.renderingCache.clear(key);
}
}

然而,这可能并不太理想。改进的一种方法是:使用额外的内部Map<字符串,字符串>缓存,并添加代码将请求的renderingKey和头的Location值存储在上面的if中;因此,调用super.renderResponse之前,您将添加代码以使用键检查映射;如果存在,则重定向到结果,并避免调用super.renderResponse

此外,假设不可能从OptimizedSsrEngine扩展,那么最好在express服务器上添加一个中间件(请参阅项目中的server.ts文件(,并在底层实现:同样的方法,使用Map来存储重定向。您可以在默认值之前添加一个中间件来检查该映射,并且只有当请求密钥不在映射中时才调用next();然后,如果是重定向,则存储请求密钥和重定向(确保从默认实现添加对next()的调用(。

相关内容

  • 没有找到相关文章

最新更新