# package.json
# "build" : "next build && next export"
> npm run build
빌드해서 생긴 out 폴더 통째로 1에서 만든 버킷에 올리기
# project root에서
aws s3 sync out s3://{s3버킷이름}
S3 루트에 _next 폴더 있어야함
출처
https://stackoverflow.com/questions/70096145/nextjs-dynamic-routing-in-amazon-cloudfront/70123764
여기서 조금바꿈
모든 dynamic route 처리는 못하고
경로 마지막에 숫자로 끝나는 것만 path/[id].html로 보냄
ex] /post/123 -> post/[id].html
const config = {
suffix: '.html',
appendToDirs: 'index.html',
removeTrailingSlash: false,
};
const regexSuffixless = /\/[^/.]+$/; // e.g. "/some/page" but not "/", "/some/" or "/some.jpg"
const regexTrailingSlash = /.+\/$/; // e.g. "/some/" or "/some/page/" but not root "/"
// const dynamicRouteRegex = /\/subpath\/\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/; // e.g /urs/some-uuid; // e.g. '/subpath/uuid'
const dynamicRouteRegex = /^(.+)\/\d+\/?$/; // e.g. /post/123
exports.handler = function handler(event, context, callback) {
const { request } = event.Records[0].cf;
const { uri } = request;
const { suffix, appendToDirs, removeTrailingSlash } = config;
if(uri.match(dynamicRouteRegex)) {
request.uri = uri.replace(dynamicRouteRegex, '$1/[id].html')
callback(null, request);
return;
}
// Append ".html" to origin request
if (suffix && uri.match(regexSuffixless)) {
request.uri = uri + suffix;
callback(null, request);
return;
}
// Append "index.html" to origin request
if (appendToDirs && uri.match(regexTrailingSlash)) {
request.uri = uri + appendToDirs;
callback(null, request);
return;
}
// Redirect (301) non-root requests ending in "/" to URI without trailing slash
if (removeTrailingSlash && uri.match(/.+\/$/)) {
const response = {
// body: '',
// bodyEncoding: 'text',
headers: {
'location': [{
key: 'Location',
value: uri.slice(0, -1)
}]
},
status: '301',
statusDescription: 'Moved Permanently'
};
callback(null, response);
return;
}
// If nothing matches, return request unchanged
callback(null, request);
};
cloudfront-동작 탭에서 하나 있는거 선택 후 편집
최하단에 함수연결에 원본요청에 Lambda@Edge 들어온거 확인
동작탭에서
우선순위: 경로패턴
0 : /_next/*
1 : 기본값(*)
되있어야함
aws cloudfront create-invalidation --distribution-id {cloudfront 아이디} --paths "/*"
완료 후 일반 탭에 있는 도메인 들어가서 확인