我在 Azure 中有 PDF 文件。链接如下:https://testtestsitweu.blob.core.windows.net/publicfiles/MyTest/doc.pdf?sp=rl&st=2024-02-15T14:18:59Z&se=2025-02-15T22:18:59Z&spr=https&sv=2022-11-02&sr=c&sig=TxTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNgU%3D
我在 Nginx 中也有一个反向代理:
location /documents {
rewrite ^ /?sp=rl&st=2024-02-15T14:18:59Z&se=2025-02-15T22:18:59Z&spr=https&sv=2022-11-02&sr=c&sig=TxTOjuaaaaaaaaaaaaaaaaaaaaaaaaaNgU%3D break;
proxy_pass https://testtestsitweu.blob.core.windows.net/publicfiles/;
proxy_ssl_name testtestsitweu.blob.core.windows.net;
proxy_ssl_server_name on;
}
当我访问时http://localhost:4200/documents/MyTest/doc.pdf
出现以下错误:
<?xml version="1.0" encoding="utf-8"?>
<Error><Code>AuthenticationFailed</Code>
<Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:e35abf59-601e-0054-5007-64329d000000
Time:2024-02-20T14:16:14.0631577Z</Message>
<AuthenticationErrorDetail>The specified signed resource is not allowed for the this resource level</AuthenticationErrorDetail></Error>
我认为它没有转发我的 GET 参数。我做错了什么?
答案1
没有理由做你正在做的事情。如果你这样做,你必须为带宽支付两次费用 - 一次用于 Azure,一次用于托管 nginx 的任何服务。
通常使用 blob 存储的原因是您不必关心存储或带宽。您可以专注于动态内容。
通常,你要么有一个 blob 存储,允许匿名访问或让你的Web 应用程序签名并提供签名的 URL直接发送给客户。
通过 nginx 代理只会花费更多时间,成本也更高。此外,你的想法行不通,因为全部的URL 必须签名 - 例如,esttestsitweu.blob.core.windows.net/publicfiles/MyTest/doc.pdf?sp=rl&st=2024-02-15T14:18:59Z&se=2025-02-15T22:18:59Z&spr=https&sv=2022-11-02&sr=c
这实际上意味着您需要根据 URL 进行动态签名。您不能进行静态附加。
您还应该阅读你在 SE 上得到的非常好的答案其中解释了一些方面。
答案2
我找到了一个用于云存储帐户的 nginx 代理的 docker 镜像,下面是 Azure 存储帐户的示例配置
location / {
proxy_set_header Host {{ .Env.AZ_STORAGE_ACCOUNT_NAME }}.blob.core.windows.net;
proxy_set_header Cookie "";
proxy_set_header Authorization "";
proxy_set_header Connection "";
proxy_hide_header x-guploader-uploadid;
proxy_hide_header x-xss-protection;
proxy_hide_header accept-ranges;
proxy_hide_header alternate-protocol;
proxy_hide_header Set-Cookie;
proxy_hide_header Expires;
proxy_hide_header Cache-Control;
proxy_ignore_headers Set-Cookie;
proxy_http_version 1.1;
proxy_intercept_errors on;
proxy_method GET;
proxy_pass_request_body off;
proxy_ignore_headers Expires Cache-Control;
proxy_cache cloud-storage;
proxy_cache_key "$host/$proxy_host$uri";
proxy_cache_valid 200 1d;
add_header X-Cache $upstream_cache_status;
{{ if eq .Env.NOT_FOUND_MEANS_INDEX "true" }}
error_page 404 =200 /index.html;
{{ end }}
# $uri is appended to proxy pass automatically, starting slash (as in location) is peeled off
proxy_pass {{ template "proxy_protocol" . }}://cloud-storage/{{ .Env.AZ_STORAGE_BLOB_URL }};
}
这使用变量
docker run -d \
-e AZ_STORAGE_ACCOUNT_NAME="[account-name]" \
-e AZ_STORAGE_BLOB_URL="[container/blob]" \
-p 8080:8080 seediacity/nginx-storage-proxy