DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Next.js 16 本地 Strapi 图片报 resolved to private ip

Strapi 图片可直连,Next 16 优化器却在本地 IP 检查时拒绝。核对真实日志、容器网络与受控开发配置,区分生产私网需求。

Strapi 的图片能在浏览器直接打开,Next.js 的图片优化请求却返回 400,服务端日志出现 resolved to private ip,列出 ::1、127.0.0.1,Strapi 没收到对应请求。先检查 Next.js 对图片源地址的限制,不必继续给已经匹配的域名重复添加 remotePatterns。

这组迹象在 Next.js 16.0.1 的本地 Strapi 环境中出现。Next.js 16 的图片优化默认不允许访问本地 IP;允许源 URL 与允许其实际网络地址,是两项不同检查。普通 400 仍可能来自其他参数或上游内容,必须结合服务端错误判断。

浏览器能打开,不表示优化器能取得图片

记录 Next.js 版本、实际图片 URL、优化请求及服务端完整错误。隐藏签名和认证值,核对源 URL 的协议、主机、端口、路径与查询条件。

如果源是 http://localhost:1337/uploads/image.png,地址匹配通过后,解析出的本地地址仍可能被拒绝。单纯把 HTTP 改成 HTTPS,不会把私有地址变成公网地址;同时还可能引入协议或证书不匹配。

要从 Next.js 进程所在的环境理解 localhost。浏览器中的它指向访问者机器,Next 容器中的它指向那个容器,并不自动指向另一个 Strapi 容器。地址限制解除后若转为连接拒绝,还需继续查真实网络拓扑,不能把不同报错当作同一步已经成功。

明确只为受控的本地开发图片开放

images.dangerouslyAllowLocalIP 默认是 false。确实需要从自己的本地开发 CMS 取得图片时,可以在保持源范围限制的前提下,显式允许开发环境的本地图片。

下面是 next.config.mjs 的相关配置示例,假设 Next.js 所在环境能访问 localhost 的 1337 端口,图片仅使用 /uploads/ 下无查询参数的地址。应合入现有配置,保留插件包装和其他设置:

export default {
  images: {
    dangerouslyAllowLocalIP: process.env.NODE_ENV === 'development',
    remotePatterns: [
      {
        protocol: 'http',
        hostname: 'localhost',
        port: '1337',
        pathname: '/uploads/**',
        search: '',
      },
    ],
  },
};

这个条件在生产环境保持关闭。它不是生产私网部署的通用配置;如果图片使用其他主机、端口或必要查询参数,也要按真实需求单独审定允许范围,而不是把限制全部省略。

该开关扩大的是优化器对已允许图片源的网络访问能力,不只放行某一张图片。图片地址可能由访客影响时,更要保留明确来源及资源范围,避免让服务器被用来访问内部网络。不能凭 URL 看起来像 localhost 就推断当前是开发环境。

按项目正常流程重启开发服务,确认运行中的配置已更新。检查真实优化请求返回图片、Strapi 取得对应请求,以及本应拒绝的来源继续被拒绝;只看到配置文件保存成功不够。

生产私网来源要按实际部署决定

Next.js 与图片服务都在私网中运行时,开发环境条件不会自动解决生产访问。需要先核对可信图片源、服务器路由和访问约束,再决定是否在那个明确范围内允许本地 IP,不默认把 CMS 暴露到公网。

Next.js 16.4.0 的正式实现仍保留本地地址保护,并检查连接使用的解析地址;不能因为换了域名或协议,就假定绕过了这项规则。发生重定向时,也要关注最终图片源地址。

unoptimized 会改成另一条图片传输路径,浏览器可能直接访问源地址。它不会修复原优化器的网络访问,访客也未必能进入服务器私网;选择前要检查图片处理、访问和页面实际需要。

保存原配置,在所需开发或受控部署中验收正常图片、拒绝来源、实际容器地址和生产配置。若配置需要撤回,恢复开关与源规则并按原发布方式生效;继续保留真实错误,不用浏览器直连成功代替优化路径验收。