React Navigation Native Web部署后路由访问404如何解决?
问题根因
你的linking对象配置不存在遗漏。本地环境运行正常是因为Expo的Web开发服务器默认支持单页应用(SPA)的客户端路由逻辑,会把所有路由请求统一 fallback 到入口的index.html文件,由React Navigation的linking模块接管路由匹配和渲染。
线上部署到AWS S3后出现404是因为S3默认的静态网站托管规则是按路径匹配真实存在的静态文件,你直接访问https://***/details时,S3会尝试查找存储桶根目录下名为details的文件或子目录下的默认索引文件,找不到就返回404错误,和前端配置无关。
修复方案
S3存储桶配置调整
- 方案1:修改错误文档配置
进入S3存储桶的「属性」标签页,找到「静态网站托管」配置项,将**错误文档(错误页)**的文件名设置为index.html,同时可将错误响应码修改为200。这样所有找不到对应静态文件的请求都会返回index.html的内容,由前端路由接管渲染。 - 方案2:配置重定向规则
如果你需要更精细的路由控制,可以在静态网站托管的「重定向规则」中添加如下JSON规则,将所有404请求重定向到入口文件:
[ { "Condition": { "HttpErrorCodeReturnedEquals": "404" }, "Redirect": { "ReplaceKeyPrefixWith": "", "HttpRedirectCode": "200" } } ]
CloudFront CDN 额外配置(若使用)
如果你的S3存储桶前端搭配了CloudFront CDN分发,需要额外在CloudFront的「错误页面」配置中添加自定义错误响应规则:
- 分别添加404、403错误的自定义响应配置
- 响应页路径设置为
/index.html - HTTP响应码修改为200
校验项
- 执行
expo build:web构建后的产物根目录确认存在index.html文件 - 确认S3存储桶的权限配置允许公开访问
index.html,不存在权限拦截导致的访问异常
内容的提问来源于stack exchange,提问作者James Chung
相关产品推荐
相关产品推荐

