nginx rewrite - 如果文件不存在则代理

时间:2014-03-19 16:23:54

标签: nginx proxy rewrite

我有一个本地目录(上传)和一个 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;
}

1 个答案:

答案 0 :(得分:1)

您应该调整location块以使用rewriteproxy_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