S3重定向到子目录

时间:2019-02-04 18:51:28

标签: nginx amazon-s3 static-site

我使用以下Nginx配置从S3使用Nginx服务站点。

server {
    listen         80 default_server;
    server_name    localhost;
    keepalive_timeout 70;
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
         proxy_pass http://my-bucket.s3-website-us-west-2.amazonaws.com;
         expires 30d;
    }

目前,每当我构建新版本时,我都只是删除目标存储桶包含并将新的前端文件上传到其中。

由于我要删除存储桶包含,因此即使在存储桶上启用了版本控制,也无法返回到前端的早期版本。因此,要将新的前端文件上传到S3存储桶的版本目录(例如15)中,然后设置从http://my-bucket.s3-website-us-west-2.amazonaws.com/latesthttp://my-bucket.s3-website-us-west-2.amazonaws.com/15的重定向

有人知道该怎么做吗?

2 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点:

  • 最简单的方法可能是通过symbolic link,前提是您的环境允许这样做。

    ln -fhs ./15 ./latest
    

  • 另一个选项是发给用户的明确的 外部redirect ,用户将在其中看到新的URL;这样做的好处是,可以同时访问多个版本而没有任何类型的同步问题,例如,如果客户端决定进行部分下载,则所有内容都应该很方便,因为它们很可能会执行在实际目标上进行部分下载,而不是/latest快捷方式。

    location /latest {
        rewrite ^/latest(.*)    /15$1   redirect;
    }
    

  • 最后一个选项是nginx中的 内部重定向 ;在某些第三方应用程序中,这通常称为URL伪装;根据要求,可能会或可能不会建议这样做;明显的缺陷是部分下载,恢复大下载可能会导致文件损坏:

    location /latest {
        rewrite ^/latest(.*)    /15$1   last;
    }
    

参考文献:

答案 1 :(得分:0)

处理这种情况的一种简单方法是使用变量。您可以轻松导入文件以设置当前最新版本。使用此方法更新版本时,需要重新加载nginx配置。

  • 创建一个简单的配置文件以设置最新版本
# /path/to/latest.conf
set $latest 15;
  • 在服务器块中导入您的最新配置,并添加一个位置以代理到最新版本。
server {
    listen         80 default_server;
    server_name    localhost;

    # SET LATEST
    import /path/to/latest.conf;

    location / {
         proxy_pass http://s3host;
         expires 30d;
    }

    # Note the / at the end of the location and the proxy_pass directive
    # This will strip the "/latest/" part of the request uri, and pass the
    # rest like so: /$version/$remaining_request_uri
    location /latest/ {
        proxy_pass http://s3host/$latest/;
         expires 30d;
    }

    ...

}

动态执行此操作的另一种方法是使用lua编写此行为脚本。不过,这要涉及更多一点,因此我不会在这个答案中提到。