使用 CloudFront 与 Route 53 在 AWS 上配置子目录
使用 AWS CloudFront 与 Route 53 在 /docs 子目录中托管您的文档。
更新 Lambda 函数代码
在 Lambda 函数编辑器中,用以下内容替换默认代码:
export const handler = async (event) => {
const request = event.Records[0].cf.request;
// 如果你的子目录不是 /docs,请更新此处
const subdirectory = '/docs';
// 在下面用你的代理 URL 更新
const target = new URL('<proxy URL you got from GitBook>');
// 重写:/docs* -> proxy.gitbook.site
if (request.uri.startsWith(subdirectory)) {
request.uri = target.pathname + request.uri.substring(subdirectory.length);
// 如有尾部斜杠则移除
if (request.uri.endsWith('/')) {
request.uri = request.uri.slice(0, -1);
}
request.origin = {
custom: {
domainName: target.host,
port: 443,
protocol: 'https',
path: '',
sslProtocols: ['TLSv1.2'],
readTimeout: 30,
keepaliveTimeout: 5,
customHeaders: {},
},
};
request.headers['host'] = [{ key: 'host', value: target.host }];
request.headers['x-forwarded-host'] = [{ key: 'x-forwarded-host', value: target.host }];
}
return request;
};务必在第 8 行将 target 更新为你在第一步从 GitBook 获取的代理 URL。它看起来像 https://proxy.gitbook.site/sites/site_XXXX
如果你使用的子目录路径不是 subdirectory ,也务必在第 5 行更新 /docs.
点击 部署 以保存你的更改。
为 Lambda@Edge 配置 Lambda 权限
在将 Lambda 函数与 CloudFront 一起使用之前,你需要配置执行角色以允许 Lambda@Edge 承担该角色。
在你的 Lambda 函数中,点击左侧边栏的 配置 选项卡
点击 权限 在左侧边栏中
在 执行角色,点击角色名称以在 IAM 中打开它
点击 信任关系 选项卡
点击 编辑信任策略
将信任策略替换为以下内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"edgelambda.amazonaws.com",
"lambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}点击 更新策略 以保存。
发布你的 Lambda 函数
Lambda@Edge 需要已发布的版本(而不仅仅是 $LATEST).
在你的 Lambda 函数中,点击右上角的 操作 下拉菜单
选择 发布新版本
可选地添加描述,例如 “用于 CloudFront 的初始版本”
点击 发布
重要: 复制出现在页面顶部的已发布版本的 ARN(它将在末尾包含一个版本号),例如
arn:aws:lambda:us-east-1:123456789:function:gitbook-subpath-proxy:1)
Lambda@Edge 函数必须在 us-east-1 (北弗吉尼亚)区域创建。如果你在其他区域创建了函数,则需要在 us-east-1 中重新创建它。
故障排除
Lambda 函数未触发:
确保你已发布 Lambda 函数的一个版本(而不是使用
$LATEST)验证 Lambda 函数是否位于 us-east-1 区域
检查信任策略是否包含
edgelambda.amazonaws.com
DNS 未解析:
DNS 更改可能需要时间传播(最长可达 48 小时,尽管通常要快得多)
验证你的 Route 53 记录是否指向正确的 CloudFront 分配
检查你是否删除了任何旧的冲突 DNS 记录
SSL 证书错误:
确保你在 AWS 证书管理器中的 SSL 证书包含你的自定义域名
CloudFront 的证书必须在 us-east-1 区域创建
子目录无法工作:
验证 Lambda 函数中的
SUBDIRECTORY值与您在 GitBook 中配置的匹配检查你在 Lambda 函数中的
target是否正确查看 CloudFront 日志以确定请求是否到达该分配
最后更新于
这有帮助吗?