部署在AWS Amplify的Gatsby JS站点直接访问子路径跳转首页如何解决?
问题核心原因
该问题是典型的静态站点SPA路由服务端适配缺失问题,和你提供的Amplify构建设置无关:
- Gatsby属于预渲染静态站点,站内跳转是前端路由接管,不需要向服务端发起新请求,所以可以正常加载子路径内容
- 直接访问子路径时,请求会先打到Amplify的静态托管服务,如果服务端没有匹配到对应路径的静态资源,也没有配置正确的重写规则,就会默认返回首页或者跳转到根路径
排查步骤
- 优先检查Amplify控制台的重定向配置:默认创建的SPA应用会自带SPA回退规则,若被误删或修改就会触发该问题
- 本地执行
gatsby build,检查生成的public目录下是否存在pricing/index.html文件,排除Gatsby本身页面构建失败、路径配置错误的问题 - 检查
gatsby-config.js中是否配置了错误的pathPrefix,或者启用了修改静态资源输出路径的不兼容插件 - 检查Amplify托管设置中是否开启了「干净URL(移除.html后缀)」功能,未开启时直接访问
/pricing会找不到资源,需要请求/pricing.html才能正常加载
解决方法
- 配置Amplify重写规则:
进入Amplify应用控制台 -> 左侧菜单选择「重定向和重写」,新增如下规则:源地址:
<*>
目标地址:/index.html
状态码:200(重写)
如果需要保留静态资源的优先匹配逻辑,避免重写规则拦截css、图片等静态资源请求,可以使用更精准的正则规则:
源地址:</^[^.]+$|\.(?!(css|gif|ico|jpg|jpeg|js|png|txt|svg|woff|woff2|json|map)$)([^.]+$)/>
目标地址:/index.html
状态码:200(重写) - 无需额外配置重写规则的方案:直接在Amplify托管设置中开启「干净URL」功能,平台会自动处理.html后缀的匹配逻辑,直接访问子路径即可正常加载对应预渲染的html文件
- 若排查发现是Gatsby构建问题,确认所有页面都放在
src/pages目录下,或者createPageAPI调用时的path参数配置正确,确保构建后public目录下存在对应子路径的index.html文件
内容的提问来源于stack exchange,提问作者Vikas Roy
相关产品推荐
相关产品推荐

