Amazon web services 路由53别名DNS记录:别名目标名称不在目标区域内

Amazon web services 路由53别名DNS记录:别名目标名称不在目标区域内,amazon-web-services,dns,amazon-route53,Amazon Web Services,Dns,Amazon Route53,我正在尝试为通过route 53购买的域设置别名。别名将指向我的站点中的一个页面,其URL如下: http://example.com/website/:id My api使用以下参数设置hostedZone: var params = { CallerReference: req.body.projectId, Name: req.body.domain, HostedZoneConfig: { Comment: `the zone created

我正在尝试为通过route 53购买的域设置别名。别名将指向我的站点中的一个页面,其URL如下:

http://example.com/website/:id
My api使用以下参数设置hostedZone:

  var params = {
    CallerReference: req.body.projectId,
    Name: req.body.domain, 
    HostedZoneConfig: {
      Comment: `the zone created on ${today} for ${req.body.domain}`,
      PrivateZone: false
    }
  };
var params = {
   ChangeBatch: {
    Changes: [
       {
      Action: "CREATE",
      ResourceRecordSet: {
       AliasTarget: {
        DNSName: `http://example.com/website/${req.body.projectId}`,
        EvaluateTargetHealth: false,
        HostedZoneId:  hostedZone.HostedZone.Id
       },
       Name: "example.com",
       Type: "A"
      }
     }
    ],
   },
   HostedZoneId: hostedZone.HostedZone.Id
  };
在下一步中,我将使用以下参数设置DNS记录:

  var params = {
    CallerReference: req.body.projectId,
    Name: req.body.domain, 
    HostedZoneConfig: {
      Comment: `the zone created on ${today} for ${req.body.domain}`,
      PrivateZone: false
    }
  };
var params = {
   ChangeBatch: {
    Changes: [
       {
      Action: "CREATE",
      ResourceRecordSet: {
       AliasTarget: {
        DNSName: `http://example.com/website/${req.body.projectId}`,
        EvaluateTargetHealth: false,
        HostedZoneId:  hostedZone.HostedZone.Id
       },
       Name: "example.com",
       Type: "A"
      }
     }
    ],
   },
   HostedZoneId: hostedZone.HostedZone.Id
  };

我得到一个错误,我的别名目标名称不在目标区域内。要正确设置该路径,我缺少了哪一步?

DNS没有处理路径的机制,因此这里尝试的是DNS中不可能的。但这似乎是试图解决另一个问题

有没有办法路由到一个通用的s3 bucket而不是一个具有匹配名称的bucket

不。。。是的

S3依赖于浏览器认为主机名应该是什么,如传入的
Host
头所示,以便将请求发送到正确的bucket

因此,当S3自身使用时,如果DNS入口指向一个bucket,则bucket名称必须与主机名完全匹配

针对不同的行为,例如
http://bucket.example.com
指向一个名为
示例bucket
的bucket,您需要一个反向代理来处理头重写,这样当浏览器指定
主机:bucket.example.com
时,S3就会收到一个带有
主机:example bucket.S3.amazonaws.com
的请求

CloudFront提供了这种反向代理功能

配置CloudFront发行版时,您需要指定一个源域名(指向存储桶)和一个备用域名,该域名指定您希望CloudFront从浏览器中获得的内容。CloudFront会在运行中重写请求,以便S3看到的内容与浏览器发送的内容不同

如该页所述,S3和CloudFront的定价结构使得单独使用S3或S3+CloudFront之间的成本差异实际上可以是任意一种——两者结合使用的成本实际上可能会稍低,具体取决于存储桶位置、查看器位置、对象大小和缓存命中率(假设不禁用CloudFront缓存)

如果您想要
https://website-1.example.com
要从
示例bucket
提供,根路径为
website/1/
您也可以这样做,但这会变得有点棘手

通过在CloudFront中的源配置上设置源路径,您可以一次性、静态地执行此操作,因为此字段表示将在每个请求发送到源之前在其前面加上的路径前缀

或者,您可以使用CloudFront和Lambda@Edge扳机,这是它的样子

“严格使用”;
//如果传入主机标头的结尾与此字符串匹配,
//剥离此部分并在请求路径上添加剩余字符,
//以及新的前导斜杠(否则,将处理请求)
//具有未修改的路径,位于存储桶的根)
const remove_suffix='.example.com';
//在此处提供正确的源主机名,以便我们发送正确的
//S3网站端点的主机头
const origin_hostname='example bucket.s3-website-us-east-1.amazonaws.com';
exports.handler=(事件、上下文、回调)=>{
const request=event.Records[0].cf.request;
const headers=request.headers;
const host_header=headers.host[0]。值;
if(host_header.endsWith(删除_后缀))
{
//将“/”+子域前置到现有请求路径(“uri”)上
request.uri='/'+host_header.substring(0,host_header.length-remove_suffix.length)+request.uri;
}
//修复主机头,以便S3理解请求
headers.host[0]。value=origin\u主机名;
//使用修改后的请求将控件返回到CloudFront
返回回调(null,请求);
};
上面是我编写和发布的一个示例。它只适用于S3网站托管功能(而不是REST端点),因为这是主机头向用户公开所必需的Lambda@Edge使用转发头白名单

它从传入主机名中获取前缀并将其重写为路径前缀,同时将所有请求发送到同一个bucket

请注意,您需要在原始响应触发器中使用一个补充函数来处理响应,检查HTTP 30x重定向。由于我们正在执行路径前缀,因此需要在反向路径上执行相反的操作,以便正确锚定
位置
标头的路径


或者只为每个站点创建一个CloudFront分发版——AWS不对分发版本身收费,只对其处理的请求收费。可以通过自动化轻松创建分发版——使用AWS cli或CloudFormation编写脚本。每个帐户的CloudFront分发版的默认限制为200,但AWS支持会根据请求增加此值。

DNS处理主机名,而不是路径。您正在尝试在DNS中执行在DNS中无法执行的操作。正确。是否有方法路由到通用s3存储桶而不是具有匹配名称的存储桶?