【问题标题】:Azure CDN rules engine to add default document EXCEPT for files requested by the siteAzure CDN 规则引擎添加默认文档,站点请求的文件除外
【发布时间】:2018-04-14 18:11:16
【问题描述】:

我正在使用 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

【问题讨论】:

  • 我也在寻找这样的解决方案,你有吗?在 URL 匹配条件之后无法进行重写,这很遗憾。

标签: azure url-rewriting azure-cdn


【解决方案1】:

我对贾斯汀·古尔德的回答有一个附录。使用“如果始终”,您将中断来自 Azure 的清除请求。幸运的是,他们有一个特定的用户代理,所以你可以匹配它。

此外,如果您使用其他规则执行此操作,它将破坏 HTTP → HTTPS 重定向。 Verizon 不会让您匹配“请求方案”以过滤掉这些请求,因此您必须偷偷摸摸地匹配 X-Forwarded-Proto。

您需要设置,而不是“IF”“始终”:

  • “IF”→“请求标头正则表达式”→名称:“User-Agent”→“不匹配”→“ECPurge/*”→忽略大小写:选中

  • “AND IF”→“请求标头文字”→名称:“X-Forwarded-Proto”→“不匹配”→“http”→忽略大小写:选中

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 很抱歉重新提出一个老问题,但我希望将所有不包含. 的网址重写为/。你说可以创建一个重写规则,它只作用于不包含. 的 URL 路径,但后来你说'这个模式捕获了其中包含 . 的 URL 路径?
    • 鉴于规则开头缺少 ^,这怎么会不捕获文件的后缀,比如 abc.def?正则表达式只是在末尾寻找 0-n 个不是点的字母。
    • 很好的解决方案,但是,您能澄清一下 XML 规则/匹配部分吗? 以及如何通过向应用查询字符串参数?
    【解决方案3】:

    看来你的问题是:

    这些文件请求都以 404 失败,因为我猜重写规则也在作用于这些文件

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

    例如,您试图在此处获取的资源:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 2022-01-02
      • 2017-11-10
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多