Azure CDN 规则引擎为站点请求的文件添加默认文档

Azure CDN rules engine to add default document EXCEPT for files requested by the site

我正在使用 Azure Verizon CDN 从 Blob 存储发布我的 Web 应用程序(SPA)。我已成功设置自定义域和 SSL。 我在 CDN 中添加了重写规则以重定向到默认文档 index.html。基本上,这接受传入请求并在 URL 路径和任何查询字符串之间插入 "index.html"。 所以 mydomain.com/startup 转到 mydomain.com/startup/index.html

mydomain.com/homepage 转到 mydomain.com/homepage/index.html

mydomain.com/showuser/?userId=xxxxx 转到 mydomain.com/showuser/index.html/?userid=xxxxx

似乎一切正常。

Existing rule to add default document

SPA 使用的地址栏中的 URL 从不请求实际文件,但默认文档 index.html 中的代码会请求。这些文件请求都以 404 失败,因为我猜重写规则也对这些文件起作用。

我想要的是在 URL 包含文件名时不执行 URL 重写的某种方法。规则引擎阻止我在使用 URL 重写功能时添加这样的条件 - 显然,当您尝试使用 URL 重写功能时,您不能在 URL 上使用任何匹配条件。

Error when trying to use condition involving URL filename

看来您的问题是:

these requests for files are all failing with a 404 because I guess the rewrite rule is acting on these as well

如果您的假设是正确的,那么您似乎需要使用文件的相对路径而不是完全限定路径来请求文件。你试过了吗?

例如,您要获取的资源在这里:

 http://example.com/resource/myresource.pdf

但是当你使用这个路径时,你会被重定向到类似这样的地方:

 http://example.com/resource/index.html/myresource.pdf

...所以当您使用相对路径引用资源时,它看起来像这样

<a href="/resource/myresource.pdf">my resource</a>

如果我误解了你的问题,或者这不能解决你的问题 - 添加你在开发者控制台 (F12) 中收到的完整错误..包括 url 应该是什么以及它转换成什么当您遇到问题时。

我也在寻找这个问题的答案。我最终不得不参与 Azure 支持。

与应用服务和 IIS 不同,当文件不存在时,CDN 无法重写 URL。但是,只要您的 SPA 路由不包含 .,您就可以创建仅作用于 URL 不包含 . 路径的重写规则。这将具有重写裸路径请求而单独保留文件请求的效果。

首先,您的 CDN 配置文件需要是 Azure 中的 Verizon Premium CDN SKU。它是唯一支持重写规则的 SKU。

  • 转到 Azure 门户中的 CDN 配置文件,然后单击 管理 按钮以打开 Verizon 管理门户。
  • Select Rules EngineHTTP Large 菜单项下。
  • 为新的默认文档规则输入您想要的任何名称。
  • 条件应设置为IF Always
  • 单击功能旁边的 + 以添加新功能。
  • Select URL 重写.
  • 注意用于选择 CDN 终结点的下拉列表。如果您的 CDN 配置文件中有多个 CDN 端点,您将需要为每个端点添加一个新功能。
  • 对于模式,输入 [^?.]*(\?.*)?$。此模式捕获其中包含 . 的 URL 路径,但不关心它是否在查询字符串中。
  • 对于路径,输入 origin_path/document.ext。这是棘手的部分。路径是相对于 origin 根目录的。例如,如果您的 CDN 终结点的原始路径是 /origin_path,并且您想要重定向到 index.html,您将输入 origin_path/index.html。如果您的 CDN 由 Azure 存储帐户支持并且源点指向容器,则情况总是如此。
  • 点击“添加”添加您的规则,等待 N 小时,您就可以开始了。

我有 Justin Gould 的回答的附录。使用 "IF Always",您将中断来自 Azure 的清除请求。幸运的是,他们有一个特定的 User-Agent,因此您可以匹配它。

此外,如果您使用其他规则执行此操作,它将破坏 HTTP → HTTPS 重定向。 Verizon 不允许您在 "Request Scheme" 上进行匹配以过滤掉这些请求,因此您必须偷偷摸摸地在 X-Forwarded-Proto 上进行匹配。

而不是 "IF" "Always",您需要设置:

  • "IF" → "Request Header Regex" → 姓名:"User-Agent" → "Does Not Match" → "ECPurge/*" → 忽略大小写:检查

  • "AND IF" → "Request Header Literal" → 姓名:"X-Forwarded-Proto" → "Does Not Match" → "http" → 忽略大小写:检查

  • 然后,按照 Justin 的其余说明进行操作。

参考:https://github.com/Azure/azure-cli/issues/6722