防止 AWS Amplify 添加斜杠和强制重定向

Posted

技术标签:

【中文标题】防止 AWS Amplify 添加斜杠和强制重定向【英文标题】:Prevent AWS Amplify From Adding Trailing Slash and Forcing Redirect 【发布时间】:2020-01-21 17:45:55 【问题描述】:

我正在使用 AWS Amplify,但无法弄清楚如何配置我的重写和重定向或 routes.js 以防止尾部斜杠破坏我的功能。

当我在本地运行我的代码并尝试访问 localhost:3000/foo/bar/id 时,页面呈现正常。当我通过 amplify 部署相同的代码并且用户单击带有 href 的按钮时,浏览器会得到一个 302 并将用户重定向到 example.com/foo/bar/id/,然后由于此页面不存在,默认的 Amplify 重定向将它们发送到 @ 987654324@ 和404

我尝试将以下内容添加到我的反应路线中:

/foo/bar/:id
/foo/bar/:id/

以及 AWS Amplify 控制台中的以下重定向规则:

/foo/bar/<id>  | /foo/bar/<id> | 302
/foo/bar/<id>/ | /foo/bar/<id> | 302

但没有任何效果。我在这里失去了理智,有什么建议吗?

【问题讨论】:

【参考方案1】:

Amplify 在尾部添加斜杠以防止出现 /about.html 之类的网址,但这可能不是真正的原因。您的应用程序/浏览器正在使用服务器端不存在的路由向服务器发出请求(您使用的是严格客户端的 SPA 路由)。尝试在 amplify js 控制台中添加以下重定向规则(在 App Settings: Redirects and rewrites > Edit > Open Text Editor):

[
    
        "source": "</^[^.]+$|\\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>",
        "target": "/",
        "status": "200",
        "condition": null
    
]

这会将所有文件重写为/index.html,这是服务器端存在的唯一路由。有关更多信息,请查看 Trailing Slashes 和 Redirects for SPAs 上的文档。

这是一张关于如何在 aws amplify 中进行此设置的图片:

我们最好在提供的文本编辑器中复制 JSON 对象。

否则,如果您要使用网络表单,请注意您必须输入此字符串作为来源:

</^[^.]+$|\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>

原因是 webform 会转义反斜杠!

【讨论】:

这真的很有帮助。我将在您的答案中添加图片以进行澄清。我遵循了解决方案,它解决了我的问题。 感谢这对我有用并解决了我的问题。每当我在手机上加载我在 Chrome/Firefox 中开发的网站时,关闭应用程序并重新打开它会重新加载最后一个网站,Amplify 会给我一个 AccessDenied 错误...【参考方案2】:

我在 Amplify 上的 Next.js 网站也遇到了同样的问题。经过几个小时的测试,我找到了以下解决方案:

[
    "source": "/report/<slug>/",
    "target": "/report/<slug>",
    "status": "200",
    "condition": null
,

    "source": "/report/<slug>",
    "target": "/report/<slug>.html",
    "status": "200",
    "condition": null
]

将此添加到您的重定向中,然后它应该可以工作。

您只需将“报告”替换为您的 url 部分。

【讨论】:

【参考方案3】:

在“重写和重定向”部分添加以下内容也对我有用。尾部斜线现在可以使用了。

[
    
        "source": "</^[^.]+$|\\.(?!(css|gif|ico|jpg|js|png|txt|svg|woff|ttf|map|json)$)([^.]+$)/>",
        "target": "/",
        "status": "200",
        "condition": null
    
]

【讨论】:

以上是关于防止 AWS Amplify 添加斜杠和强制重定向的主要内容,如果未能解决你的问题,请参考以下文章

当 url 没有斜杠时,AWS s3 强制 302 重定向 - 需要 301s

在 AWS amplify 中重写和重定向

javascript 使用AWS Lambda重定向到CloudFront上的尾部斜杠。 (所有这一切都因为S3使用302重定向而不是301)

在 AWS Amplify 中更改我的 GraphQL 架构时如何防止丢失生产数据?

重定向时的 Apache vhost 双斜杠

AWS Elasticbeanstalk 单实例强制 SSL 重定向循环