Azure CDN Microsoft标准规则引擎重写单页应用程序的URL

20
我们尝试在Microsoft Standard定价的Azure CDN上配置,以允许我们重写URL以将所有应用程序路由到./index.html。如何设置规则引擎以重写URL但将所有js文件保持不变?Google中的所有示例都展示了如何在高级定价上完成此操作,但我们希望在Microsoft Standard上实现,这可能吗?

我冒昧更改了此问题的标签,因为这个问题并不是真正的Angular特定问题(例如,对于部署react-router应用程序的人同样有用)。作为一种相对“难以找到”的配置,特别是使用Microsoft Standard CDN Rules Engine部署SPA,请考虑将接受的答案更改为在此情况下实际有效的解决方案。 - spender
3个回答

35

我最终从Microsoft的支持中心得到了一个可行的答案。他们说Microsoft CDN规则引擎不支持URL文件扩展名Not Any,而是建议我检查文件扩展名的长度。

  • 条件:URL文件扩展名
    • 运算符= 不大于
    • 扩展名= 0
    • 大小写转换= 无转换
  • 操作:URL重写
    • 源模式= /
    • 目标= /index.html
    • 保留未匹配路径=

这个解决方案对我有效。在测试之前,请确保清除CDN缓存。


1
对我来说有效,但我必须将目标设置为/index.html。 - Bryant
1
你们有没有想过如何在Verizon Premium上实现同样的规则? - Victor Reyes
1
@cankemik 我们使用了两个重写规则。首先是 /50D231B/endpoint-name/(.*sub-path/?)($|\?.*)/50D231B/endpoint-name/(.*path)((?:[^\?]*/)?[^\?/.]+)($|\?.*),都重写到 /50D231B/endpoint-name/folder-on-storage/sub-path/index.html。遗憾的是我不能完全记得这个规则的解释。 - Victor Reyes
1
@VictorReyes,看起来解决方案是使用IF Always条件将正确的目录与正则表达式映射起来。感谢您的解释。 - cankemik
1
@cankemik 是的,Angular 应该在路由中管理这些重定向,但对于像 CSS 或 JS 这样的文件,它们需要直接进入存储文件夹。 - Victor Reyes
显示剩余3条评论

5
如果您的网页URL中没有点,则可以设置以下规则:
条件:'URL文件扩展名'=不是任何(即没有扩展名)
操作:'URL重写'
源= /
目标= index.html
保留路径不匹配=否
这将使任何没有点的URL重写到index.html。

1
我无法让这个对我起作用。出于某种原因,我仍然得到了404错误。 - G3tinmybelly
@G3tinmybelly 你尝试过清除 CDN 吗? - CrazyBaran
1
是的,但我仍然收到404未找到错误。最终我联系了Azure支持,希望他们能解决我的问题。 - G3tinmybelly
这并没有回答问题,因为这种方法似乎在使用Microsoft标准CDN规则引擎时无法工作。另一方面,得到高票的答案提供了一个预期的解决方法:https://dev59.com/lVMH5IYBdhLWcg3woQct#59585005 - spender

4
我在Azure Blob存储和Microsoft CDN上设置静态网站时遇到了挑战。
以下是我完成它的方法。
如果您想使用PowerShell脚本来实现此目标,请使用以下脚本。该脚本还包含一个用于设置HTTP到HTTPS重定向的规则:
# Define Variables
$RESOURCE_GROUP_NAME = MyResourceGroup
$PROJECT = MyProject
$CDN_PROFILE_NAME = MyCDNProfile

# Create a New Http to Https Redirect Rule
$RULE_CONDITION_1 = New-AzCdnDeliveryRuleCondition -MatchVariable 'RequestScheme' -Operator 'Equal' -MatchValue 'HTTP'
$RULE_ACTION_1 = New-AzCdnDeliveryRuleAction -RedirectType 'Moved' -DestinationProtocol 'Https'
$HTTP_TO_HTTPS_RULE = New-AzCdnDeliveryRule -Name 'HttpToHttpsRedirectRule' -Order 1 -Condition $RULE_CONDITION_1 -Action $RULE_ACTION_1

# Create a New SPA Rewrite Rule
$RULE_CONDITION_2 = New-AzCdnDeliveryRuleCondition -MatchVariable 'UrlFileExtension' -Operator 'LessThan' -MatchValue '1'
$RULE_ACTION_2 = New-AzCdnDeliveryRuleAction -SourcePattern '/' -Destination '/index.html'
$SPA_REWRITE_RULE = New-AzCdnDeliveryRule -Name 'SpaRewriteRule' -Order 2 -Condition $RULE_CONDITION_2 -Action $RULE_ACTION_2

# Set the CDN Delivery Policy with the CDN Delivery Rule(s)
$CDN_DELIVERY_POLICY = New-AzCdnDeliveryPolicy -Description "Https redirect policy" -Rule $HTTP_TO_HTTPS_RULE,$SPA_REWRITE_RULE

# Get CDN Endpoint
$CDN_ENDPOINT = Get-AzCdnEndpoint -ProfileName $CDN_PROFILE_NAME -ResourceGroupName $RESOURCE_GROUP_NAME -EndpointName $PROJECT

# Assign the CDN Delivery Policy to the CDN Endpoint
$CDN_ENDPOINT.DeliveryPolicy = $CDN_DELIVERY_POLICY

# Save CDN Endpoint Changes with Updated Delivery Policy
Set-AzCdnEndpoint -CdnEndpoint $CDN_ENDPOINT

您应该会看到类似于这样的输出:

在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接