【发布时间】:2019-08-24 00:10:51
【问题描述】:
我有一个 SPA(使用 Angular 构建)并部署到 Azure Blob 存储。从默认域开始一切正常,但是当我刷新任何页面/路由时,index.html 不再被加载,而是收到错误“请求的内容不存在”
谷歌搜索该术语总共会产生 3 个结果,所以我在尝试诊断和解决此问题时不知所措。
【问题讨论】:
标签: azure azure-storage azure-blob-storage
我有一个 SPA(使用 Angular 构建)并部署到 Azure Blob 存储。从默认域开始一切正常,但是当我刷新任何页面/路由时,index.html 不再被加载,而是收到错误“请求的内容不存在”
谷歌搜索该术语总共会产生 3 个结果,所以我在尝试诊断和解决此问题时不知所措。
【问题讨论】:
标签: azure azure-storage azure-blob-storage
【讨论】:
404,但正文中将包含index.html 内容。
实际上,问题是我没有定义 404.html —— SPA 的 blob 存储不了解要为根路径以外的任何其他路径提供什么文件。因此,其他所有路由都将转到 404 文件。但在 SPA 中,即使 404 也会通过索引文件。所以我所做的只是提到 index.html 作为我的 404 文件,一切都很好。
【讨论】:
对我来说,将 index.html 页面添加为错误文档页面在通过 url 导航时没有帮助,因为它仍然会重新加载应用程序。我在其他地方发布了一个与使用 Angular HashLocationStrategy 相关的答案,并且在手动更改 URL 时不会导致页面重新加载。
【讨论】:
Microsoft 提供了一个新的静态 Webapps 解决方案。它目前处于预览模式,但我认为这是在 Azure 基础架构中使用/部署 SPA 的最便捷方式。例如,您可以将自定义域与免费 SSL、版本控制一起使用,并设置一个路由以将所有内容重定向到 index.html(备用路由:https://docs.microsoft.com/en-us/azure/static-web-apps/routes)。在此处查看更多详细信息:https://docs.microsoft.com/en-us/azure/static-web-apps/
【讨论】:
404 行为现在已修复。至少有关 fallback routes 的文档声明它应该返回 200。
通常,您已经创建了 CDN 配置文件和端点,但您的内容似乎在 CDN 上不可用。尝试通过 CDN URL 访问您的内容的用户会收到 HTTP 404 状态代码。您可以在troubleshooting Azure CDN endpoints that return a 404 status code中遵循这些方法
有几种可能的原因,包括:
文件的来源对 CDN 不可见。端点是 配置错误,导致 CDN 查找错误的位置。主机是 拒绝来自 CDN 的主机标头。端点没有时间 在整个 CDN 中传播。
使用CDN,在初始请求时,客户端直接访问源服务器,之后,在以下请求中,当您刷新页面时,客户端向CDN缓存服务器请求直到它们的生存时间(TTL ) 过去。请参阅Manage expiration of Azure Blob storage in Azure CDN 和Control Azure CDN caching behavior with caching rules。
在这种情况下,您可以确保网站 blob 内容在 Internet 上公开可用。之后,您可以验证您的原始设置是否已正确配置。验证 Origin 类型和 Origin 主机名的值是否正确。验证 HTTP 和 HTTPS 端口是否表示为您的静态网站正在侦听。请您从该疑难解答链接中获取更多详细信息。
【讨论】:
您也可以将错误文档 (404) 设置为您的 index.html
这是一个快速修复,仍然会返回 404,但实际上也会跟随您的深层链接。
这不是“修复”。这更像是一种 hack - 真正的解决方法是在您的托管服务器上添加一个带有一些 URL 重定向规则的 CDN。这是一个很棒的指南:https://antbutcher.medium.com/hosting-a-react-js-app-on-azure-blob-storage-azure-cdn-for-ssl-and-routing-8fdf4a48feeb
但是为了节省您的点击,使用标准微软 CDN(更便宜的)的 CDN 规则是这样的:
(add the condition with the '+ condition' button)
If URL file extension > less than 1 extension > no case transform
(add the action with '+ Add action' button)
source pattern: '/' > Destination: '/index.html' > preserve unmatched path: no
我会尝试添加一个我认为没有其他人做得很好的解释。
这条规则的作用是说出任何不是直接文件的 URL 请求,例如。
example.com/xyz
example.com/user/xyz
example.com/tabs/post/12345
或任何没有直接文件扩展名(如“.png”或“.pdf”或“.html”)
然后我们将 URL 重写为“index.html”,这是 SPA 有 javascript 来处理示例中的路径的深层链接的主机文件 - 因此您不会得到 404,代码将正常处理.
【讨论】: