为了提高页面访问速度,通常会把文件上传到 CDN,nextjs 提供了一个配置 assetPrefix 来实现,我们只需要在 next.config.js 里面配置 assetPrefix 即可:

const isProd = process.env.NODE_ENV === 'production';
module.exports = {
// 生产环境CDN域名
assetPrefix: isProd ? 'https://static.kelen.com' : undefined,
};

这样请求的资源就会从原先的**「服务域名」变成「CDN 域名」**,举个例子,原来的资源路径是:

https://www.kelen.cc/_next/static/chunks/123456.js

新的资源路径就变成:

https://static.kelen.com/_next/static/chunks/123456.js

注意:上传 CDN 的资源应该只限制 **.next/static/** 目录下的资源,不应该上传其他资源,防止服务敏感信息泄漏

url parameter not allowed

配置完上线后访问页面,发现某些有一些图片 404,图片的格式一般是 https://www.kelen.cc/\_next/image?url=https%3A%2F%2Fstatic.kelen.com%2Fimages%2Favatar.jpg&w=384&q=75 ,报错 url parameter not allowed ,那么为什么有些图片可以正常访问,有些图片就报错呢?

通过阅读源码可以发现,nextjs 对 Image 组件的图片,会通过自己的服务做中转请求,然后返回给客户端,相当于通过 _next/image 这个接口来获取静态资源的图片,然而并非所有的图片都会去获取,只有指定域名才行。所以解决这个问题的方法就是在 next.config.js 里面配置 images 选项,指定允许的域名:

const isProd = process.env.NODE_ENV === 'production';
module.exports = {
// 生产环境CDN域名
assetPrefix: isProd ? 'https://static.kelen.com' : undefined,
images: {
domains: ['static.kelen.com'],
},
};

通过上述配置后,就可以正常解决问题了,不过 **domains** 这个配置在 Nextjs14 之后会废弃,取而代之的是 **remotePatterns**

remotePatterns

Nextjs 集成了 Image 组件的一些优化功能,为了防止用户恶意攻击,我们需要确保只有信任来源的图片才进行图片优化,remotePatterns 配置项就可以解决这个问题。

module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'static.kelen.cc',
port: '',
pathname: '/',
},
],
},
};

通过上述配置,重新部署,问题即可完美解决。