You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js生产环境无法访问public目录下的非图片文件

Next.js生产环境public非图片文件403/无法访问问题解决

问题排查步骤与解决方案

1. 确认构建输出是否包含目标文件

运行npm run build后,检查构建输出目录:

  • 若使用App Router默认构建:查看.next/public下是否存在PDFs、Lotties文件夹及对应文件
  • 若使用静态导出(next export):查看out目录下是否有上述文件

如果文件缺失,说明构建过程未复制这些非图片资源,需配置Webpack处理对应文件类型。

2. 配置Webpack处理PDF/Lottie文件

在项目根目录的next.config.js中添加以下配置,确保Next.js构建时将PDF和Lottie文件作为静态资源复制到输出目录:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config) => {
    // 处理PDF和Lottie文件
    config.module.rules.push({
      test: /\.(pdf|lottie)$/,
      type: 'asset/resource',
      generator: {
        filename: '[path][name].[ext]' // 保留原目录结构输出
      }
    });
    return config;
  }
};

module.exports = nextConfig;

3. 服务器/托管平台访问规则检查

如果构建输出已包含目标文件但仍返回403,需检查服务器的静态资源访问规则:

  • Nginx配置:添加允许PDF/Lottie文件访问的规则
    location ~* \.(pdf|lottie)$ {
        allow all;
        try_files $uri $uri/ =404;
    }
    
  • 托管平台(如Vercel/Netlify):检查是否有自定义Headers或访问限制规则,默认情况下这些平台允许public目录下所有文件访问,若有自定义规则需确保未拦截目标文件类型。

4. 后端函数正确访问文件路径

若通过API路由/后端函数读取文件,需使用本地文件系统路径而非URL路径,示例代码:

import { readFileSync } from 'fs';
import path from 'path';
import { NextResponse } from 'next/server';

export async function GET() {
  // 拼接public目录下的文件绝对路径
  const filePath = path.join(process.cwd(), 'public', 'Lotties', 'example.lottie');
  const fileContent = readFileSync(filePath);
  
  // 返回文件并设置正确的Content-Type
  return new NextResponse(fileContent, {
    headers: {
      'Content-Type': 'application/json', // Lottie文件为JSON格式
      'Content-Disposition': 'inline'
    }
  });
}

内容的提问来源于stack exchange,提问作者Amir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:30:59