背景
我使用带有 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?