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

如何通过API Gateway暴露AWS Lambda中的React静态文件目录?

解决API Gateway+Lambda部署React静态应用的静态资源403问题

核心问题原因

API Gateway仅配置了根路径/的GET集成,当请求静态资源(如/main.js、/static/css/main.css)时,API Gateway找不到对应的资源路由,直接返回403。同时Lambda Handler当前仅处理根路径请求,未适配静态资源路径的文件读取逻辑。

解决步骤

1. 配置API Gateway通配符资源与集成

  • 登录AWS控制台,进入目标API Gateway的REST API
  • 在根资源/下创建新资源,资源路径填写/{proxy+}(通配符匹配所有子路径请求)
  • 为/{proxy+}资源添加GET方法,选择Lambda代理集成,关联到已有的React静态应用Lambda函数
  • 重新部署API到指定阶段(如prod)

2. 修改Lambda Handler适配静态资源请求

更新Lambda代码,使其能根据请求路径读取对应静态文件,并返回正确的响应头:

const fs = require('fs');
const path = require('path');

exports.handler = async (event) => {
  // 处理根路径或React路由路径,默认返回index.html
  let requestPath = event.path === '/' ? '/index.html' : event.path;
  const fullFilePath = path.join(__dirname, 'build', requestPath);

  try {
    // 读取目标文件
    const fileBuffer = fs.readFileSync(fullFilePath);
    // 根据文件后缀设置Content-Type
    let contentType = 'text/html';
    const ext = path.extname(requestPath).toLowerCase();
    switch (ext) {
      case '.js':
        contentType = 'application/javascript';
        break;
      case '.css':
        contentType = 'text/css';
        break;
      case '.png':
        contentType = 'image/png';
        break;
      case '.jpg':
      case '.jpeg':
        contentType = 'image/jpeg';
        break;
      case '.svg':
        contentType = 'image/svg+xml';
        break;
      case '.json':
        contentType = 'application/json';
        break;
    }

    return {
      statusCode: 200,
      headers: {
        'Content-Type': contentType,
        'Cache-Control': 'public, max-age=31536000' // 静态资源开启长期缓存
      },
      body: fileBuffer.toString('base64'),
      isBase64Encoded: true
    };
  } catch (error) {
    // 文件不存在时返回index.html,适配React单页路由
    const indexBuffer = fs.readFileSync(path.join(__dirname, 'build', 'index.html'));
    return {
      statusCode: 200,
      headers: { 'Content-Type': 'text/html' },
      body: indexBuffer.toString()
    };
  }
};

3. 确认打包配置正确性

如果使用CDK的NodejsFunction,确保commandHooks正确将React build目录复制到Lambda部署包中:

import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

const reactStaticLambda = new NodejsFunction(this, 'ReactStaticLambda', {
  entry: './src/handler.js',
  commandHooks: {
    postInstall: (inputDir, outputDir) => {
      // 将项目根目录下的build文件夹复制到Lambda打包目录
      return [`cp -r ${inputDir}/../build ${outputDir}/build`];
    }
  }
});

注意:根据你的项目目录结构调整cp命令的路径,确保build目录最终出现在Lambda代码的同级目录下。

4. 验证配置

  • 重新部署Lambda和API Gateway
  • 访问应用根路径,检查静态资源加载状态;测试React路由路径(如/about),确认能正常返回index.html并渲染路由内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:25:19