【问题标题】:S3 redirect to sub-directoryS3 重定向到子目录
【发布时间】:2019-02-04 18:51:27
【问题描述】:

我使用 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 的重定向

任何人都知道如何做到这一点?

【问题讨论】:

  • 您是否可以这样做,或者如何做到这一点,将取决于您如何将 Nginx 与此存储桶一起使用。请解释一下 Nginx 是如何被使用的。
  • 使用 nginx 配置更新。
  • @roy 如果有任何答案解决了您的问题,请确保支持并接受。如果您不执行任何操作,则会损失全部赏金。如果没有答案是充分的,请解释为什么两个答案都不足。谢谢!

标签: nginx amazon-s3 static-site


【解决方案1】:

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

  • 只要您的环境允许,最简单的方法可能是通过symbolic link

    ln -fhs ./15 ./latest
    

  • 另一个选项是向用户发出明确的external redirect,用户将在其中看到新的 URL;这样做的好处是可以同时访问多个版本,而不会出现任何同步问题,例如,如果客户端决定进行部分下载,那么一切都应该很方便,因为他们很可能会做在实际目标上进行部分下载,而不是 /latest 快捷方式。

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

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

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

参考资料:

【讨论】:

    【解决方案2】:

    处理这种情况的一种简单方法是使用变量。您可以轻松导入文件以设置当前的最新版本。使用此方法更新版本时,您需要重新加载 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 编写此行为的脚本。不过,这涉及更多一点,所以我不会为此回答。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多