Nginx(使用mod_zip)取消转义URL输入 背景

Nginx(使用mod_zip)取消转义URL输入 背景,url,nginx,escaping,Url,Nginx,Escaping,我使用带有mod_zip(,在Github上)的Nginx作为代理,将数据从Amazon的S3流式传输到存档中 mod_-zip采用空格分隔的参数清单。换行符分隔新文件。 每行的格式为: CRC[-用于未知]大小位置文件名 两行清单示例: - 4 /pro-core.com/prostore/9228407_foobar.txt?AWSAccessKeyId=key&Expires=sometime&Signature=signed foo/foobar.txt - 288134

我使用带有mod_zip(,在Github上)的Nginx作为代理,将数据从Amazon的S3流式传输到存档中

mod_-zip采用空格分隔的参数清单。换行符分隔新文件。 每行的格式为:
CRC[-用于未知]大小位置文件名

两行清单示例

- 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
"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"
这将创建一个包含2个目录的存档:

|- foo
|   |- foobar.txt
|- bar
    |- 38.png
我的nginx.conf文件

- 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
"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"
用户nginx

工人1

error\u log/usr/local/nginx/logs/error.log调试

事件{ 工人(1024);; }

http{ 包括mime.types; 默认_类型应用程序/八位字节流

#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\u 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,用于密钥中包含parens的文件:

来自nginx日志

- 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
"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

我有一个解决问题的方法,就是从S3键中删除括号。这并不理想,但现在它解决了我们的问题。

Nginx将解码传递给代理传递的uri,因此中断对s3的调用。

您的curl请求是发送到amazon还是您自己的Nginx服务器?如果这些请求被发送到您的nginx服务器,那么问题是应该首先编码的请求。为了进行公平比较,我会将curl请求发送到amazon和nginx服务器,看看是否得到不同的响应。由于我的应用程序使用nginx作为S3的代理,因此我很难直接连接到nginx。我已经更新了我的问题以澄清curl输出。基于您的nginx配置
proxy\u过程http://s3.amazonaws.com;
nginx应将原始$request\u uri传递给上游服务器。因此,最可能的情况是,错误的取消转义发生在您的应用程序服务器中。我不能100%确定mod_zip如何处理我的应用程序的响应(包含S3URL的清单)。我可以验证我的应用程序在传递给nginx之前是否生成了正确转义的URL。mod_zip/nginx后来对它所做的对我来说是一个黑匣子。请不要用评论/问题来回答。可以理解的是,您的代表太低,无法发表评论,但这仍然不意味着应该使用答案作为备选方案发表评论。如果您删除此内容,则会更好。