我有一个本地目录(上传)和一个 S3 存储桶设置。
当用户上传图像时,文件存储在本地目录中:/uploads/member_id/image_name
30分钟后系统将文件上传到 S3 ,路径相同:s3.amazonaws.com/bucket/member_id/image_name;
我已经在我的nginx服务器上设置了这个重写规则,但是它没有用。 此规则应检查文件是否存在于本地,如果不存在,请打开代理 S3 ..
知道怎么解决吗?
location /uploads/
{
rewrite ^/uploads/(.*)/([A-Za-z0-9\._]*)$ /uploads/$1/$2?imgname=$2&member=$1;
try_files $uri @fallback;
}
location @fallback
{
resolver 8.8.8.8;
proxy_pass $scheme://s3.amazonaws.com/bucket/$arg_member/$arg_imgname;
proxy_set_header Host s3.amazonaws.com;
}
答案 0 :(得分:1)
您应该调整location
块以使用rewrite
和proxy_pass
指令的组合,以便动态重写每个请求。根据您的配置,变量似乎不是基于每个请求来解决的 - 根据Nginx's documentation,只能通过变量指定服务器名称,端口和URI。
您需要的是类似于此的内容,重写URI并明确指定代理:
location @fallback
{
resolver 8.8.8.8;
rewrite ^.*$ /bucket/$arg_member/$arg_imgname break;
proxy_pass http://s3.amazonaws.com;
proxy_set_header Host s3.amazonaws.com;
}
并且为了满足您的可切换方案(HTTP和HTTPS),最佳选择可能有两个独立的服务器块,有两个不同的@fallback
位置 - 一个用于HTTP,另一个用于HTTPS。在此上下文中,proxy_pass
位置无法解析$scheme
。关于支持的内容(及其原因)的细节有些粗略,但我们必须继续Nginx's documentation。