我正在尝试自定义 NextJS 服务器在提供在构建时 (SSG) 生成的页面时响应的Cache-Control
标头。理由很简单:鉴于每个服务器响应都由 CDN 根据其标头进行缓存,并且鉴于我希望在推出新部署后立即刷新每个静态页面,默认缓存策略(s-maxage=31536000, stale-while-revalidate
,源)不会为我削减它。
如果将revalidate
选项设置为1
(0
引发构建错误),它将非常接近预期行为,但它会产生每秒最多重新生成一次页面的不幸副作用。如上所述,页面是严格静态的,因此服务器每分钟呈现 60 次只会浪费资源。
export const getStaticProps: GetStaticProps<
EntityProps,
EntityPathParams
> = async (context) => {
const id = context.params.id;
const entity = getEntity(id);
// Activates ISR--waste of resources
return { props: entity, revalidate: 1 };
};
应该注意的是,在next.config.js
中设置的Cache-Control
标头在生产中被非常"有用"地覆盖,因此这不是一个可行的解决方案。
module.exports = {
// ...
async headers() {
return [
// Overridden in production
{
source: '/entity/:path',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=0, must-revalidate',
},
],
},
];
},
};
目前我没有看到任何自定义标题的方法。我弄错了吗?你能指出我一些额外的资源吗?你知道有什么替代方法吗?
你不能。如果您使用的是 SSG,则站点会在构建期间构建,这意味着当用户看到站点时根本不涉及服务器。页面构建完成后,您将包含所有资产、html 和 js 文件的 out 文件夹发送到一些静态网站托管,例如 AWS S3。在那里,您可以自定义发送到浏览器的缓存标头。
摘要:SSG 发生在 nextjs 构建时,它会生成 HTML,然后托管服务器必须提供这些文件。