首页 > 解决方案 > Azure CORS 变量允许的来源

问题描述

每当在 Azure DevOps 中运行新的发布管道时,URL 都会更改。目前我的 ARM 模板有一个硬编码的 URL,如果继续手动添加可能会很烦人。

"cors": {
      "allowedOrigins": [
        "[concat('https://',parameters('storage_account_name'),'.z10.web.core.windows.net')]"
    }

唯一改变的是10部分,z10所以本质上我希望它像 [concat('https://',parameters('storage_account_name'),'.z', '*', '.web.core.windows.net')]我不知道这样的东西是否有效但本质上是这样的,以便 cors 策略将接受 URL,而不管 z 数如何。

标签: azurecorsazure-resource-manager

解决方案


基本上说这是不可能的,因为 CORS 标准(参见文档)。它只允许精确的来源、通配符或空值。

例如,用于 Azure 存储的 ARM 也遵循此模式,允许您放置确切来源列表或通配符(请参阅 ARM 文档

但是,如果您知道您的网站名称,则可以在您的 ARM 中接收完整的主机并在您的 CORS 中使用它:

"[reference(resourceId('Microsoft.Web/sites', parameters('SiteName')), '2018-02-01').defaultHostName]"

如果您知道存储帐户名称,则与静态网站(我猜是您的情况)相同:

"[reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2019-06-01', 'Full').properties.primaryEndpoints.web]"

高级参考输出操作

回答评论 - 如果您想替换reference函数输出中的某些字符,最简单的方法是使用内置替换函数(请参阅文档

如果您需要更高级的场景,我将通过引入一个自定义函数来粘贴我的解决方案,该函数正在删除https:///从最后https://contonso.com/转换为contonso.com

"functions": [
   {
      "namespace": "lmc",
      "members": {
         "replaceUri": {
            "parameters": [
                {
                   "name": "uriString",
                   "type": "string"
                }
             ],
             "output": {
                "type": "string",
                "value": "[replace(replace(parameters('uriString'), 'https://',''), '/','')]"
             }
         }
      }
  }
],

# ...(some code)...

"resources": [
# ... (some resource)...:
      "properties": {
         "hostName": "[lmc.replaceUri(reference(variables('storageNameCdn')).primaryEndpoints.blob)]"
       }
]

推荐阅读