AWS静态网站-如何将子域与子文件夹连接起来
AWS static website - how to connect subdomains with subfolders
我想设置 S3 静态网站并连接到我的域(例如域:example.com)。
在这个 S3 存储桶中,我想创建一个特定的文件夹(名称 content)和许多不同的子文件夹,然后我想将这些子文件夹与适当的子域连接起来,所以对于例子
- 文件夹 content/foo 应该可以从子域 foo.example.com,
- fodler content/bar 应该可以从子域 bar.example.com.
获得
任何 content 子文件夹都应该自动从具有相同前缀名称(如文件夹名称)的子域中可用。
对于此问题的任何可能解决方案,我将不胜感激。我应该使用重定向选项还是有更好的解决方案?在此先感谢您的帮助。
我的解决方案基于此视频:
https://www.youtube.com/watch?v=mls8tiiI3uc
因为上面的视频没有解释子域问题,这里有一些额外的事情要做:
- 在AWS Route53 hostage zone中,我们应该添加以“*.domainname”作为记录名称和边缘地址作为值的记录A
- 我们还应该在证书域中添加“*.domainname”- 以获得通配符域的证书
- 在设置 Cloudfront 分发时,我们应该添加到“备用域名 (CNAME)”部分“www.domainname”以及“*.domainname”
- redirection/forwarding从子域到子文件夹是通过Lambda@Edge函数实现的(函数应该改进一点):
'use strict';
exports.handler = (event, context, callback) => {
const path = require("path");
const remove_suffix = ".domain.com";
const host_with_www = "www.domain.com"
const origin_hostname = "www.domain.com.s3-website.eu-west-1.amazonaws.com";
const request = event.Records[0].cf.request;
const headers = request.headers;
const host_header = headers.host[0].value;
if (host_header == host_with_www) {
return callback(null, request);
}
if (host_header.startsWith('www')) {
var new_host_header = host_header.substring(3,host_header.length)
}
if (typeof new_host_header === 'undefined') {
var new_host_header = host_header
}
if (new_host_header.endsWith(remove_suffix)) {
// to support SPA | redirect all(non-file) requests to index.html
const parsedPath = path.parse(request.uri);
if (parsedPath.ext === "") {
request.uri = "/index.html";
}
request.uri =
"/" +
new_host_header.substring(0, new_host_header.length - remove_suffix.length) +
request.uri;
}
headers.host[0].value = origin_hostname;
return callback(null, request);
};
- Lambda@Edge 只是与特定 Cloudfront 分布相关的 Lambda 函数
- 需要为 Lambda 执行添加到 Cloudfront 分发的附加设置(如果我们想对不同的子域进行不同的重定向,则需要此设置,而不是所有重定向将指向主目录或可能指向将被缓存的第一个目录 -对我们的 Cloudfront 域的第一个请求):
我想设置 S3 静态网站并连接到我的域(例如域:example.com)。
在这个 S3 存储桶中,我想创建一个特定的文件夹(名称 content)和许多不同的子文件夹,然后我想将这些子文件夹与适当的子域连接起来,所以对于例子
- 文件夹 content/foo 应该可以从子域 foo.example.com,
- fodler content/bar 应该可以从子域 bar.example.com. 获得
任何 content 子文件夹都应该自动从具有相同前缀名称(如文件夹名称)的子域中可用。 对于此问题的任何可能解决方案,我将不胜感激。我应该使用重定向选项还是有更好的解决方案?在此先感谢您的帮助。
我的解决方案基于此视频: https://www.youtube.com/watch?v=mls8tiiI3uc
因为上面的视频没有解释子域问题,这里有一些额外的事情要做:
- 在AWS Route53 hostage zone中,我们应该添加以“*.domainname”作为记录名称和边缘地址作为值的记录A
- 我们还应该在证书域中添加“*.domainname”- 以获得通配符域的证书
- 在设置 Cloudfront 分发时,我们应该添加到“备用域名 (CNAME)”部分“www.domainname”以及“*.domainname”
- redirection/forwarding从子域到子文件夹是通过Lambda@Edge函数实现的(函数应该改进一点):
'use strict';
exports.handler = (event, context, callback) => {
const path = require("path");
const remove_suffix = ".domain.com";
const host_with_www = "www.domain.com"
const origin_hostname = "www.domain.com.s3-website.eu-west-1.amazonaws.com";
const request = event.Records[0].cf.request;
const headers = request.headers;
const host_header = headers.host[0].value;
if (host_header == host_with_www) {
return callback(null, request);
}
if (host_header.startsWith('www')) {
var new_host_header = host_header.substring(3,host_header.length)
}
if (typeof new_host_header === 'undefined') {
var new_host_header = host_header
}
if (new_host_header.endsWith(remove_suffix)) {
// to support SPA | redirect all(non-file) requests to index.html
const parsedPath = path.parse(request.uri);
if (parsedPath.ext === "") {
request.uri = "/index.html";
}
request.uri =
"/" +
new_host_header.substring(0, new_host_header.length - remove_suffix.length) +
request.uri;
}
headers.host[0].value = origin_hostname;
return callback(null, request);
};
- Lambda@Edge 只是与特定 Cloudfront 分布相关的 Lambda 函数
- 需要为 Lambda 执行添加到 Cloudfront 分发的附加设置(如果我们想对不同的子域进行不同的重定向,则需要此设置,而不是所有重定向将指向主目录或可能指向将被缓存的第一个目录 -对我们的 Cloudfront 域的第一个请求):