1

我正在使用cloudfront设置cdn。我的云端分布的起源是我的aws负载平衡器(ELB)。当我向云端请求而不是获取云端地址(cdn.mysite.com/images/image.jpg)时,它将被重定向到https://www.alio.com/images/image.jpg。我想通过我的nginx.conf为什么会这样做:Cloudfront Nginx重写导致问题

server { 
    root /var/www/html/alio/public; 
    index index.php; 

    server_tokens off; 

    server_name www.alio.com; 

    location/{ 
     if ($http_x_forwarded_proto != 'https') { 
      rewrite^https://$host$request_uri? permanent; 
     } 
     try_files $uri $uri/ /index.php?$query_string; 
    } 
    location ~ \.php$ { 
     try_files $uri /index.php =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 

重写^ https:// $ host $ request_uri?常驻;更改网址(当我删除重写我得到的CDN网址)。我有这个重写,以确保对我的网站的所有请求都是https。如果有办法做,而不是重写301重定向,或者如果我检测到它是云前台拨打ELB的电话,那么不要重写?

回答

3

您是否将CloudFront配置为白名单主机头?

对于每个行为>转发标题>选择'白名单'>从列表中选择'主机'并点击添加。

此设置可确保主机头(cdn.mysite.com)包含在返回原点的请求中(因此请确保已将cdn.mysite.com添加到您的server_name指令中)。

如果您只希望通过TLS访问您的站点,那么使用HTTP Strict Transport Security标头也可能值得考虑。添加以下内容到您的配置应该这样做:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 
+0

感谢,这个工作 – gprime

0

我看到这些类型的构造很多。他们是阿帕奇派,你应该学会以不同的方式做事。

Http和https是协议,因此应该在协议处理级别处理,而不是处理文档位置的地方,除非它们是位置特定的,在您的情况下它们不是。

这也可以让事情保持清洁,并且不会在http层次上无意中配置某些东西,从而绕过始终的https逻辑。

所以总是HTTPS很简单:

server { 
    listen 80; 
    return 301 https://$host$request_uri; 
} 

server { 
    listen 443 ... ; 
    .... 
} 

不应该使问题更加复杂:-)