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

如何配置AWS API Gateway实现透传与请求头子域名转发

解决方案:AWS API Gateway 租户请求透传配置

方案1:Lambda代理集成(推荐)

Lambda代理集成可以完全控制请求转发逻辑,支持动态修改目标域名,步骤如下:

  • 创建Lambda函数,接收API Gateway代理请求(事件包含headers、path、httpMethod等字段)
  • 从请求头x-cust-domain提取租户子域名,拼接目标API地址:https://${custDomain}.xyz.com${event.path}
  • 用HTTP客户端(如Node.js的axios、Python的requests)转发请求,保留原请求的方法、头、请求体
  • 将目标API的响应原样返回给API Gateway,包含状态码、响应头、响应体

示例Node.js代码:

const axios = require('axios');

exports.handler = async (event) => {
    const custDomain = event.headers['x-cust-domain'];
    if (!custDomain) {
        return {
            statusCode: 400,
            body: JSON.stringify({ error: 'Missing x-cust-domain header' })
        };
    }
    
    const targetUrl = `https://${custDomain}.xyz.com${event.path}`;
    const config = {
        method: event.httpMethod,
        url: targetUrl,
        headers: { ...event.headers },
        data: event.body ? JSON.parse(event.body) : undefined
    };
    
    try {
        const response = await axios(config);
        return {
            statusCode: response.status,
            headers: response.headers,
            body: JSON.stringify(response.data)
        };
    } catch (error) {
        return {
            statusCode: error.response?.status || 500,
            body: JSON.stringify({ error: error.message })
        };
    }
};
  • 在API Gateway中配置Lambda代理集成,将所有/api/*路径指向该Lambda函数
  • 确保Lambda函数具备访问目标租户API的网络权限(目标在VPC内则配置VPC访问,否则直接使用公网权限)

方案2:HTTP API集成重写(无Lambda)

若使用HTTP API而非REST API,可直接通过集成配置实现地址重写:

  • 创建HTTP API,添加路由/api/{proxy+}
  • 配置集成类型为HTTP集成,目标地址设为https://{x-cust-domain}.xyz.com/api/{proxy}
  • 在集成的请求参数中,将请求头x-cust-domain映射到集成的主机头变量
  • 开启HTTP API的路径重写和头映射功能,确保x-cust-domain的值正确注入目标主机名

方案3:REST API自定义VTL映射模板

针对REST API,可通过集成请求的VTL模板动态修改目标地址:

  • 创建REST API,配置资源/api/{proxy}及对应方法
  • 配置集成类型为HTTP,初始目标地址设为占位符(如https://placeholder.xyz.com/{proxy})
  • 在集成请求的映射模板中,使用VTL提取x-cust-domain并生成目标URL:
#set($custDomain = $input.params('x-cust-domain'))
#if($custDomain)
    #set($targetUrl = "https://$custDomain.xyz.com$context.resourcePath/$context.path.proxy")
#else
    #set($targetUrl = "https://default.xyz.com$context.resourcePath/$context.path.proxy")
#end
$context.setVariable("targetUrl", $targetUrl)
  • 确保API Gateway有权动态解析目标域名,部分区域可能需额外配置权限

过往方案失败原因排查

  • Lambda授权器:仅用于授权校验,不支持修改请求目标地址,不适用于该场景
  • 302重定向失败:大概率是客户端不支持自动跟随重定向,或重定向地址跨域被浏览器拦截。若必须用重定向,建议返回307 Temporary Redirect(保留原请求方法和体),而非302(会自动转为GET请求)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:01:09