gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:22:24 27 4
gpt4 key购买 nike

我有一个本地目录(上传)和一个 S3 桶设置。
当用户上传图片时,文件存储在本地目录:/uploads/member_id/image_name30 分钟后,系统将文件上传到 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;
}

最佳答案

您应该调整您的 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这就是我们所要做的。

关于nginx 重写 - 如果文件不存在则代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512112/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com