多条件Nginx重定向

时间:2015-11-11 15:31:36

标签: ruby-on-rails nginx url-redirection amazon-cloudfront

在nginx中,我正在尝试找出处理重定向的最佳方法,以便当且仅当流量不在/ assets / *路径中时,才强制所有非https流量到https。

使用案例:使javascript和css能够通过AWS CloudFront缓存,而无需从服务器链接SSL证书。

以下是我的尝试:

{{1}}

我试过包装&please; #red;'在引号中,没有运气。有任何想法吗?欢迎其他可行的解决方案。请记住,它必须是非https请求,而不是/ assets / path。谢谢!

3 个答案:

答案 0 :(得分:0)

只需将主服务器设置为仅侦听https,并将http上的单独服务器设置为重定向和资产。

其他服务器配置可能看起来像

server {
  server_name  example.com;

  location ~ ^/assets/|favicon.ico {
    root /home/deploy/www/public;
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  location / {
    rewrite ^(.*) https://example.com$1 permanent;
  }
}

答案 1 :(得分:0)

使用^〜和=位置以获得最佳性能。重复的静态内容指令是值得的。您可以随时将它们放在包含的文件中以便于维护:

server {
    listen 80;
    root /home/deploy/www/public;

    location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    location = /favicon.ico {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
    }

    location / {
        return 301 https://$http_host$request_uri;
    }
}

答案 2 :(得分:0)

问题是重定向的位置。愚蠢的错误......对于任何想要通过CloudFront发送rails资产管道的人来说,你将在使用CORS的woff和tiff文件上遇到问题,并且你需要发送额外的标题来允许原始请求。我们选择通过http向cloudfront提供静态资产,以避免在CloudFront中链接SSL证书。这是解决方案。

server {
    listen  80;

    location ~ ^/assets/|favicon.ico|robots.txt {
        root /home/deploy/www/public;
        gzip_static on;
        expires max;
        add_header Cache-Control public;
        if ($http_origin ~* 'https?://subdomain\.cloudfront.net') {
                add_header 'Access-Control-Allow-Origin' "$http_origin";
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
        }
    }

    location / {

        # ELB Injects:  X-Forwarded-Proto: HTTP or HTTPS
        if ( $http_x_forwarded_proto = "http" ) {
            return  301 https://$http_host$request_uri;
        }

        proxy_pass http://127.0.0.1:9292/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}