【问题标题】:nginx rewrite - proxy if file not existsnginx rewrite - 如果文件不存在则代理
【发布时间】:2014-04-26 01:36:19
【问题描述】:

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

【问题讨论】:

  • 你是否设置了根定义,以便 nginx 知道在本地搜索文件的位置?
  • 是的,根目录已设置,如果我删除位置 /uploads/ 我可以在本地看到文件。
  • 尝试将 error_log 指令添加到备用位置,并将详细信息放在这里。从 S3 代理文件最重要的是 proxy_passresolver 但您可以像这里一样调整它:coderwall.com/p/rlguog

标签: nginx proxy rewrite


【解决方案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 是我们所要做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2020-08-18
    • 2013-12-24
    相关资源
    最近更新 更多