Ruby on rails 多条件Nginx重定向
在nginx中,我试图找到处理重定向的最佳方法,当且仅当流量不在/assets/*路径中时,将所有非https流量强制为https 用例:支持通过AWS CloudFront缓存javascript和css,而无需从服务器链接SSL证书 以下是我正在尝试的:Ruby on rails 多条件Nginx重定向,ruby-on-rails,nginx,url-redirection,amazon-cloudfront,Ruby On Rails,Nginx,Url Redirection,Amazon Cloudfront,在nginx中,我试图找到处理重定向的最佳方法,当且仅当流量不在/assets/*路径中时,将所有非https流量强制为https 用例:支持通过AWS CloudFront缓存javascript和css,而无需从服务器链接SSL证书 以下是我正在尝试的: server { listen 80; if ( $http_x_forwarded_proto = "http" ) { set $redir please_redir; } loca
server {
listen 80;
if ( $http_x_forwarded_proto = "http" ) {
set $redir please_redir;
}
location ~ ^/assets/|favicon.ico {
set $redir dont_redir;
root /home/deploy/www/public;
gzip_static on;
expires max;
add_header Cache-Control public;
}
if ( $redir = please_redir ) {
return 301 https://$http_host$request_uri;
}
location / {
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;
}
}
我也试着用引号把“please\u redir”括起来,但没有成功。有什么想法吗?我们欢迎其他可行的解决办法。请记住,它必须是非https请求,并且不在/assets/path中。谢谢 只需将主服务器设置为仅侦听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;
}
}
使用^~和=位置可获得最佳性能。重复的静态内容指令是值得的。为了便于维护,您始终可以将它们放在包含的文件中:
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;
}
}
问题是重定向的位置。愚蠢的错误。。。对于任何希望通过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;
}
}
这里的问题是,所有请求都来自端口80(ssl在负载平衡器上卸载)。您可以在我的代码中看到,我依赖于http_x_forwarded_protocol,然后尝试在
/
位置内移动条件(并立即重写,不带变量)。为此,它没有准确回答问题,但它确实引导我找到了解决方案。重定向在错误的位置。