2

背景

我使用带有 mod_zip 的 Nginx(http://wiki.nginx.org/NgxZip 在 Github 上)作为代理,将来自 Amazon S3 的数据流式传输到存档中。

mod_zip 采用空格分隔的参数清单。换行符分隔新文件。每行的格式为: CRC[- for unknown] size location filename

两行清单示例

- 4 /pro-core.com/prostore/9228407_foobar.txt?AWSAccessKeyId=key&Expires=sometime&Signature=signed foo/foobar.txt
- 288134 /pro-core.com/prostore/9228400_38.png?AWSAccessKeyId=key&Expires=soon&Signature=signed bar/38.png

这将创建一个包含 2 个目录的存档:

|- foo
|   |- foobar.txt
|- bar
    |- 38.png

我的 nginx.conf 文件

用户 nginx;

worker_processes 1;

error_log /usr/local/nginx/logs/error.log 调试;

事件 {worker_connections 1024; }

http { 包括 mime.types; default_type 应用程序/八位字节流;

#access_log  logs/access.log  main;

keepalive_timeout  0;
sendfile off;
gzip  off;

server {
    listen       8008;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    root html;

    location / {
        internal;
    }

    location /pro-core.com/ {
        internal;
        proxy_pass http://s3.amazonaws.com;
        proxy_buffering off;
        proxy_buffers 2 4m;
        proxy_buffer_size 4m;
        proxy_busy_buffers_size 4m;
    }

    location /download/ {
        proxy_pass  http://localhost:3000/utilities/s3_manifest_for_nginx_to_zip_and_stream/;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header  Accept-Encoding identity;
    }

}

}

问题

mod_zip 似乎用括号做了一些有趣的事情。我的一些 S3 密钥中有括号,例如9228403_foobar (1).txt. 我无法更改 S3 密钥。在清单中,我有一行如下所示:

- 4 /pro-core.com/prostore/9228403_foobar%20%281%29.txt?AWSAccessKeyId=key&Expires=time&Signature=signed foo/foobar _1_.txt

请注意,位置 URL 已转义。当我尝试打开生成的存档时,它已损坏。悲伤的熊猫。查看 nginx 错误日志,我从 S3 获得了一个 403 文件,该文件的键中有括号:

从 nginx 日志

"GET /pro-core.com/prostore/9228403_foobar%20(1).txt?AWSAccessKeyId=key&Expires=time&Signature=signed HTTP/1.0
...
[debug] : *31 http proxy status 403 "403 Forbidden"

请注意,位置 URL 中的括号不再被转义。我通过 curl 执行普通的“GET”来验证 URL 是问题所在。

$ curl -v http://s3.amazonaws.com/..._foobar%20(1).txt?...
=> 403 Forbidden -- SignatureDoesNotMatch

$ curl -v http://s3.amazonaws.com/..._foobar%20%281%29.txt?...
=> 200 OK -- contents of foobar (1).txt

问题

有什么方法可以更改我的应用程序中的某些内容,或者告诉 nginx 或 mod_zip 不要取消转义我的 URL?

4

2 回答 2

0

对于我的问题,我有一个解决方法,即从我的 S3 密钥中删除括号。这并不理想,但它现在解决了我们的问题。

于 2013-04-25T21:04:42.500 回答
0

Nginx 将解码传递给代理通道的 uri,从而中断您对 s3 的调用。

于 2017-12-22T08:12:00.317 回答