![Nginx 代理到 S3 存储桶获取 400 无效参数](https://linux22.com/image/804892/Nginx%20%E4%BB%A3%E7%90%86%E5%88%B0%20S3%20%E5%AD%98%E5%82%A8%E6%A1%B6%E8%8E%B7%E5%8F%96%20400%20%E6%97%A0%E6%95%88%E5%8F%82%E6%95%B0.png)
我有一个 Django 应用程序,其中我通过 nginx 代理向 s3 提供媒体文件。
相关的python代码
response = HttpResponse()
response['X-Accel-Redirect'] = '/s3_redirect/%s' % filefield.url.replace('http://', '')
response['Content-Disposition'] = 'attachment; filename=%s' % filefield.name
return response
内部重定向的 nginx 块是
location ~* ^/s3_redirect/(.*) {
internal;
set $full_url http://$1;
proxy_pass $full_url;
并且 s3 记录的请求是。
REST.GET.OBJECT <media file> "GET <media file>" 400 InvalidArgument 354 - 4 -
"http://<referer>" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3)
AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" -
我无论如何也想不出哪里出了问题。应用程序发送给 nginx 的 URL 是有效的,它在浏览器中可以正常工作。而且 nginx 正在向 s3 发送请求。
答案1
我猜问题出在我的 nginx 配置上。需要添加一些配置。按照这个博客文章幫助了。
将这些行添加到我的 nginx conf 中
proxy_http_version 1.1;
proxy_set_header Host $s3_bucket;
proxy_set_header Authorization '';
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_ignore_headers "Set-Cookie";
proxy_buffering off;
proxy_intercept_errors on;