如何向 Nginx 代理添加 GET 查询参数?

如何向 Nginx 代理添加 GET 查询参数?

我在 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

https://github.com/seediacity/docker-nginx-storage-proxy

相关内容