如何将自定义响应标头添加到来自 azure blob 的响应?
Posted
技术标签:
【中文标题】如何将自定义响应标头添加到来自 azure blob 的响应?【英文标题】:How to add custom response header to a response coming from azure blob? 【发布时间】:2021-12-28 07:04:17 【问题描述】:我正在向我的 blob 存储发出 curl 请求。
$ curl -kv 'https://myazstorage.blob.core.windows.net/myazcontainer/image.png?se=2021-11-17T09%3A23%3A23Z&sp=r&sv=2019-02-02&sr=b&sig=%fake/fake%3D' \
--compressed \
--output image.png
该 blob 上此请求的可用响应标头是。
Content-Length: 224250
Content-Type: image/png
Last-Modified: Tue, 16 Nov 2021 14:12:51 GMT
Accept-Ranges: bytes
ETag: "0x8D9A90B2CD4ED6B"
Vary: Origin
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: 39bf369d-b01e-00ca-3b94-db83fe000000
x-ms-version: 2019-02-02
x-ms-creation-time: Tue, 16 Nov 2021 14:12:51 GMT
x-ms-lease-status: unlocked
x-ms-lease-state: available
x-ms-blob-type: BlockBlob
x-ms-server-encrypted: true
Date: Wed, 17 Nov 2021 09:20:04 GMT
我想添加这两个标题。
Origin: mywebsite.com
Cross-Origin-Resource-Policy: cross-origin
如何添加适用于容器中每个 blob 的自定义响应标头?可以通过portal.azure.com接口实现吗?
【问题讨论】:
【参考方案1】:AFAIK,如果您直接从 Azure 存储访问 blob,则无法添加自定义标头来响应。
一种可能性是让您的用户通过 Web 应用程序请求 Blob,然后当 Web 应用程序发回响应时,您应该能够添加额外的标头。
其他选项是使用 blob 元数据。如果这些自定义响应头的值不会改变,您可以将它们设置为 blob 上的元数据,然后当您直接访问 blob 时,您将获取元数据头作为响应。
【讨论】:
【参考方案2】:观察
@Gaurav Mantri answer 是对的。在撰写本文时,您无法将自定义标头添加到从 Azure Blob 存储生成的响应中。
“一种可能性是让您的用户通过 Web 应用程序请求 Blob,然后当 Web 应用程序发回响应时,您应该能够添加额外的标头。”
这对我的应用程序来说是不可能的,因为对 azure blob 的请求来自 <img src="https://path.to/container/blob">
标记。
"其他选项是使用 blob 元数据。如果这些自定义响应标头的值不会改变,您可以将它们设置为 blob 上的元数据,然后当您直接访问 blob 时,您将获得元数据响应的标头。”
这是真的,但是,通过修改容器元数据(右键单击容器 >并选择编辑元数据)扩展标头,将生成@形式的自定义响应标头987654331@ - 这不是我想要的。此外,这些标头必须在Resource sharing (CORS)
部分中公开。
上下文
让我首先通过解释上下文来解决这个问题。我正在尝试从私有 Azure Blob 存储加载图像。 blob 存储的每个 URI 都包含一个 blob 的唯一性,SAS Token 由 READ permission
生成,在有限的时间内允许读取 blob(在我的例子中是图像)。效果很好!
问题
我直接使用 img
标签加载 blob/图像。
<img src="https://myStorage.blob.core.windows.net/myContainer/image.png?SAS_TOKEN">
很遗憾,由于此错误blocked:NotSameOriginAfterDefaultedTOSameOriginByCoep
表示的CORS,资源被浏览器阻止
修复
修复很简单,我只需将其中一些标头添加到 Azure Blob 生成的响应中。
Origin: mywebsite.com
Cross-Origin-Resource-Policy: cross-origin
Access-Control-Allow-Origin: https://mywebsite.com
很遗憾,由于观察部分中指定的原因,无法进行此修复。
解决方案
解决方案包括两个步骤:
-
将
crossorigin="anonymous"
属性添加到img
标记。
<img crossorigin="anonymous" src="https://myStorage.blob.core.windows.net/myContainer/image.png?SAS_TOKEN">
-
在 Azure 存储帐户 资源共享 (CORS) 部分中为
* allowed and exposed headers
的 GET
方法添加 https://mywebsite.com
到 Blob service
。
现在来自 blob 的每个响应都将包含 Access-Control-Allow-Origin: mywebsite.com
标头。
【讨论】:
以上是关于如何将自定义响应标头添加到来自 azure blob 的响应?的主要内容,如果未能解决你的问题,请参考以下文章
身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应
如何在 PowerShell 中运行 appCmd 以将自定义标头添加到默认网站