带有 Verizon 的 Azure CDN - 重写 URL 以始终加载 index.html

Azure CDN with Verizon - Rewriting URL to always load index.html


上下文


过去几天我一直在努力解决以下问题,由于 CDN 的性质和每个新规则的人工审查,我每次部署新规则最多需要 4 小时.

如以下主题所述,我目前将我的 Angular 应用程序部署到一个 存储帐户,它有一个 blob 容器 调用了 cdn

在这个 blob 容器 root 中,我的 angular 项目中的整个 dist 文件夹有通过我的 CI 设置复制。

CDN 配置文件也已设置,指向名为 /cdn

origin-path


问题


不幸的是,目前正在进行 issue 您无法直接访问默认文件。

  1. 我想要的是重定向来自我的 Angular 的所有传入流量 应用到 index.html 文件。这是为了满足路由 Angular.

  2. 此外,我想允许任何对静态文件(例如图像)的请求 通过没有任何特定的 url 重写。

我看过关于这个问题的各种帖子,但 none 的答案似乎涵盖了我的情况,或者没有提供预期的结果。

目前我正在使用来自 Verizon 的 Azure CDN 规则引擎 功能。

关于模式,我使用了 following article 中提到的所有模式,包括评论中提到的模式。

我也花了至少两天时间寻找各种其他文章和 Whosebug 文章,但其中 none 对我的情况有用。

此外,我还创建了自己的正则表达式模式,但尽管它们在我的测试环境中工作,但一旦部署到 CDN,它们就会工作。

我通常会得到以下结果之一:

Microsoft 的官方 documentation 对我的情况也没有帮助。

我很确定我不是第一个将 Angular 应用程序部署到存储帐户的人,有人 运行 遇到了与我相同的问题。

我很感谢能给我指明正确方向的任何信息,因为目前我确实在考虑放弃整个存储帐户部署。


更新 1


使用下面 source 模式 ((?:[^\?]*/)?)($|\?.*) 也被提到 article 在这里,我至少能够处理顶级域重写到 index.html 文件.

不幸的是,我仍然需要一个额外的模式来从 https://myFancyWebsite.azureedge.net/login/callback 重定向到 https://myFancyWebsite.azureedge.net/index.html


更新 2


我目前每天更新一次或两次正则表达式模式,它再次在我的测试环境中工作,但一旦我部署它就停止工作。我开始相信 Azure CDN 会在顶级域之后向 URL 附加一些内容,但我不知道如何验证这一点。

https://regex101.com/r/KK0jCN/23


更新 3


我们写的是 3025 年,我仍然不知道为什么例如以下模式不处理顶级域的 url 重写。

https://regex101.com/r/KK0jCN/25

根据您的要求,我自己测试了这个问题。根据我的测试,您可以尝试利用以下 URL 重写规则:

来源模式:(http[s]?://[^\?/#]+)(/(?!images)(?!scripts)[^\?#]*)?($|[\?#].*)

目标模式:/index.html

注意:为了正确加载其他文件(.ico、.txt、.js、.css等),您需要将它们移动到新的虚拟机中目录而不是 blob 容器的根目录。例如,您可以将图像文件移动到 cdn\images 并将 JavaScript 文件移动到 cdn\scripts,然后正则表达式将忽略相关的虚拟文件夹。

此外,您可以使用 Azure Web App 托管您的静态网站并选择免费定价层或共享层,每个实例每月花费 9.49 美元。您可以关注的详细信息 Pricing calculator.


更新:

根据Justin的回答,我检查了这个问题,发现对于Blob存储源类型,URL Rewrite下的SourceDestination是针对blob的请求存储端点。因此,我们需要针对 blob 端点的请求路径和查询字符串设置正则表达式。

Justin Gould 提供了将所有内容重写为 cdn/index.html 的答案。根据您的情况,我已经测试了我的规则,它可以在我这边工作。

测试:

  • 添加条件为 If Always
  • 的新规则
  • 您需要为每个端点添加一个新功能。
  • 对于模式,输入 [^?.]*(\?.*)?$。此模式捕获其中包含 . 的 URL 路径,但不关心它是否在查询字符串中。
  • 对于路径,输入 origin_path/document.ext。这是棘手的部分。路径是相对于原始根的。例如,如果您的 CDN 终结点的原始路径是 /origin_path,并且您想要重定向到 index.html,您将输入 origin_path/index.html。如果您的 CDN 由 Azure 存储帐户支持并且源点指向容器,则情况总是如此。
  • 点击“添加”添加您的规则,等待 N 小时,您就可以开始了。

补充一下。如果你使用的是 Azure Verizon Premium CDN,并且你的 Azure 端点使用的是原始路径。原始路径是重写的一部分。例如,假设您要指向 $web blob 中的版本化文件夹。

因此,如果上图中的“源路径”是 2.1.2,而您当前的静态应用程序在 $web/2.1.2/,那么您对 ​​CDN 的重写将是 Source: /<your-verizon-origin>/<your-azure-endpoint>/(.*)\/[^?.]*(\?.*)?$ - -> 目的地:/<your-verizon-origin>/<your-azure-endpoint>//index.html