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

借助Lambda Edge将爬虫流量路由至不同服务器

解决CloudFront将爬虫流量路由到Elastic Beanstalk服务器的问题

我明白你的困惑——你找到的示例都是指向S3存储桶的,但其实CloudFront的request.origin对象支持多种源类型,S3只是其中一种。要路由到你的Elastic Beanstalk服务器(比如api.<domainname>.com),你需要使用自定义HTTP/HTTPS源的配置格式,而不是s3属性。

先解释下request.origin的结构

CloudFront根据你配置的源类型,会在request.origin里设置对应的属性:

  • s3:当源是S3存储桶时使用
  • custom:当源是HTTP/HTTPS服务器(比如你的Elastic Beanstalk实例、EC2或者外部API)时使用

修改后的代码示例

下面是调整后的Lambda@Edge代码,会把爬虫流量转发到你的API服务器:

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    let is_crawler = undefined;

    // 检查请求头里的"is-crawler"标记
    if ('is-crawler' in request['headers']) {
        is_crawler = request['headers']['is-crawler'][0].value.toLowerCase();
    }

    if (is_crawler === 'true') {
        // 替换为自定义源(你的Elastic Beanstalk服务器)
        request.origin = {
            custom: {
                domainName: 'api.<domainname>.com', // 替换成你的实际API域名
                port: 443, // 如果用HTTPS就是443,HTTP是80
                protocolPolicy: 'https-only', // 可选:强制HTTPS,或者"http-only"/"match-viewer"
                path: '', // 如果需要给请求加前缀可以在这里设置,比如'/crawler'
                customHeaders: {}
            }
        };
        // 可选:如果需要修改Host头,确保源服务器能正确识别请求
        request.headers['host'] = [{ key: 'Host', value: 'api.<domainname>.com' }];
    }

    callback(null, request);
};

关键注意事项

  • 源配置权限:确保你的Elastic Beanstalk服务器的安全组/防火墙允许CloudFront的IP访问(或者配置CloudFront作为源的可信访问者)
  • HTTPS配置:如果你的API服务器用HTTPS,要确保CloudFront能验证证书(建议使用AWS证书管理器颁发的证书)
  • Host头设置:有些服务器依赖Host头来路由请求,所以上面的代码里加上了修改Host头的逻辑,根据你的实际情况调整
  • 触发器位置:这个Lambda函数要设置为CloudFront的Viewer Request触发器,这样能在请求到达CloudFront后立即修改路由

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:09:10