nginx重写-如果文件不存在,则代理

nginx重写-如果文件不存在,则代理,nginx,proxy,rewrite,Nginx,Proxy,Rewrite,我有一个本地目录(上传)和一个S3存储桶设置。 用户上载图像时,文件存储在本地目录中:/uploads/member\u id/image\u name 30分钟后,系统将文件上传到S3,路径相同:S3.amazonaws.com/bucket/member\u id/image\u name 我已经在我的nginx服务器上设置了这个重写规则,但它不起作用。 此规则应检查文件是否在本地存在,如果不存在,请打开一个代理到S3 知道怎么修吗 location /uploads/ { rewr

我有一个本地目录(上传)和一个S3存储桶设置。 用户上载图像时,文件存储在本地目录中:
/uploads/member\u id/image\u name
30分钟后,系统将文件上传到S3,路径相同:
S3.amazonaws.com/bucket/member\u id/image\u 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;
}

您应该调整
位置
块以使用
重写
代理传递
指令的组合,以便动态重写每个请求。在您的配置中,变量似乎不是基于每个请求来解析的——根据,变量只能指定服务器名称、端口和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\u pass
位置无法解析
$scheme
。关于支持什么(以及为什么)的详细信息有点粗略,但这是我们要做的全部。

您是否设置了根定义以便nginx知道本地搜索文件的位置?是,根目录已设置,如果我删除位置/上载/我可以在本地看到该文件。请尝试将error_log指令添加到回退位置,并将详细信息放在此处。从S3代理文件最重要的事情是代理过程和解析器,但您可以对其进行如下调整: