nginx重写-如果文件不存在,则代理
我有一个本地目录(上传)和一个S3存储桶设置。 用户上载图像时,文件存储在本地目录中: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
/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代理文件最重要的事情是代理过程和解析器,但您可以对其进行如下调整: