我正在尝试将 Nginx 设置为 S3 上托管的静态 html/js webapp 的代理。我阅读了大量教程和帖子,如果我的存储桶设置为公开,我就可以让它工作。
我需要 Nginx 作为代理的原因是我不希望我的存储桶公开。
下列的这指南中,我添加了 set-misc-nginx-module这GitHub repo。额外模块通过提供 AWS 密钥和 AWS 机密,为存储桶的每个对象构建经过身份验证的 S3 请求。
我重新编译了 Nginx,并设法允许它访问受保护的存储桶。问题是我无法呈现 html,基本上我得到的是试图代理的存储桶的 xml 内容。
这是Nginx的配置文件
server {
listen 80;
server_name [MY_DNS];
location * {
set $bucket '[MY_BUCKET]';
set $aws_access '[MY_AWS_KEY]';
set $aws_secret '[MY_AWS_SECRET]';
set $url_full "$1";
set_by_lua $now "return ngx.cookie_time(ngx.time())";
set $string_to_sign "$request_method\n\n\n\nx-amz-date:${now}\n/$bucket/$url_full";
set_hmac_sha1 $aws_signature $aws_secret $string_to_sign;
set_encode_base64 $aws_signature $aws_signature;
resolver 172.31.0.2 valid=300s;
resolver_timeout 10s;
proxy_http_version 1.1;
proxy_set_header Host $bucket.s3.amazonaws.com;
proxy_set_header x-amz-date $now;
proxy_set_header Authorization "AWS $aws_access:$aws_signature";
proxy_buffering off;
proxy_intercept_errors on;
rewrite .* /$url_full break;
proxy_pass http://s3.amazonaws.com;
}
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
如果我尝试访问我的网站,结果如下
<ListBucketResult>
<Name>[MY_BUCKET]</Name>
<Prefix />
<Marker />
<MaxKeys>1000</MaxKeys>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>index.html</Key>
<LastModified>[LAST_MODIFIED]</LastModified>
<ETag>[ETAG]</ETag>
<Size>22</Size>
<Owner>
<ID>[OWNER_ID]
</ID>
<DisplayName>[NAME]</DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>
**编辑:**index.html 确实将内容类型设置为 text/html。
我可能遗漏了 Nginx 配置中的某些内容。
如果我将整个存储桶设置为公共,并且使用“简单”代理方法,那么一切都会正常工作。
答案1
您很可能已经解决了这个问题,但您可以尝试 在指令
proxy_hide_header Content-Type;
中添加location
答案2
尝试将位置更改为
location ~ '^/(.*)' {