我想完成两件事
- 希望动态创建301和302重定向
- 想要重定向到外部URL
我有盖茨比4.2.0版本。
我正在从Sanity获取重定向数据,并在gatsby-node.js中创建重定向
if (redirects && redirects.length > 0) {
redirects.forEach((redirect) => {
createRedirect({
fromPath: redirect.fromPath,
toPath: redirect.toPath,
statusCode: rarseInt(edirect.statusCode),
force: true,
});
});
示例重定向来自Sanity的数据:
[
{
_id: 'b6b1a54e-9642-4509-a691-9b183d15b681',
_createdAt: '2022-01-18T15:25:57Z',
fromPath: '/test/',
statusCode: '301',
toPath: '/services/'
},
{
_id: 'f8f1c364-0305-4848-9f89-750d8eaadcee',
_createdAt: '2022-01-19T13:49:56Z',
fromPath: '/test2/',
statusCode: '302',
toPath: 'www.google.com'
} ]
我使用的是gatsby-plugin-s3,它检测创建重定向,并在构建时在.cache目录内创建:s3.sls.routingRules.json、s3.routingRules.json等。
但是,我可以看到statusCode始终是302,而不是createRedirect((中设置的301
最好的方法是什么?
我无法在gatsby插件离线中修复始终设置为302的状态代码。我也想实现内部和外部重定向。
我的解决方案是在构建时使用gatsby-node.js,而不是使用createRedirect((。从Sanity获取重定向后,我正在创建重定向.json文件,其中重定向(from和TO(是完整URLS(例如:https://test.com/test/)。
const fs = require("fs");
if (redirects && redirects.length > 0) {
let r = [];
redirects.forEach((redirect) => {
let fromPathSplit = redirect.fromPath.split("://")[1].split("/");
fromPathSplit.shift();
const keyCondition = fromPathSplit.join("/");
const toPathSplit = redirect.toPath.split("://");
const redirectProtocol = toPathSplit[0];
const urlSplit = toPathSplit[1].split("/");
const hostName = urlSplit[0];
const path = urlSplit.slice(1).join("/");
r.push({
RoutingRuleCondition: {
KeyPrefixEquals: keyCondition,
},
RedirectRule: {
ReplaceKeyWith: path,
HttpRedirectCode: redirect.statusCode,
Protocol: redirectProtocol,
HostName: hostName,
},
});
});
fs.writeFile("redirects.json", JSON.stringify(r), function (err) {
if (err) console.log("creating redirects.json file error", err);
});
}
创建重定向.json后,我将其设置为S3 Bucket的RoutingRules配置
FrontendBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:custom.frontendBucketName}
AccessControl: PublicRead
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: 404.html
RoutingRules: ${file(./redirects.json)}