如何使用 200 响应将 404 错误(和 403)重定向到 index.html

How to redirect 404 errors (and 403) to index.html with a 200 response

我正在构建一个静态网站,该网站使用 JS 解析 URL 以便确定要显示的内容。

我需要每个 URL 实际打开 index.html JS 可以分开路径并采取相应行动的地方。

例如 http://my.site/action/params 将被解析为带有一些参数 params.

action

后台,这将使用自定义错误重定向通过 CloudFront 从 AWS S3 提供 - 这在 AWS 上运行良好。

但是,我正在尝试在 Ubuntu 运行 apache 下构建开发环境,并希望在本地模拟重定向。

我发现有几页很接近,但不完全。

This page 展示了如何重定向到服务器上名为“404”的文件中的自定义错误页面。由于 404 是实际的错误响应代码,示例看起来有点混乱,我无法修改示例以指向 index.html.

已接受答案中的示例表明:

Redirect 200 /404
ErrorDocument 404 /404

我修改为:

Redirect 200 /index.html
ErrorDocument 404 /index.html

但是这个 returns 一个标准的 404 未找到错误页面。

如果我删除 Redirect 行,只留下 ErrorDocument 行,我会根据需要返回 index.html 页面,但 https 状态响应仍然是 404 代码,我需要它是 200。

如果我按照示例离开重定向行,实际上我得到的结果与修改后的版本相同,所以我怀疑这是不正确的行,但我无法弄清楚。

(我正在使用 Chrome 开发工具控制台查看状态代码等)。

我想我找到了使用重写规则而不是错误文档的解决方案。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

我在这种方法中缺少的关键似乎是 而不是 在重写规则的末尾包含一个 R=??? 状态响应代码。我花了一段时间才找到它!

因为它使用 mod_rewrite 而不是定义错误页面,我假设该机制与 CloudFront 的执行方式不同,但对于我的开发系统需要,结果似乎是相同的 - 这意味着我可以在网站上工作,而不必在每次代码更改和上传后使 CloudFront 缓存失效。