多条件 Nginx 重定向
Multi-condition Nginx Redirect
在 nginx 中,我试图找出处理重定向的最佳方法,当且仅当流量不在 /assets/* 路径中时,强制所有非 https 流量到 https。
用例:使 javascript 和 css 能够通过 AWS CloudFront 进行缓存,而无需从服务器链接 SSL 证书。
这是我正在尝试的:
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_redir' 括在引号中,但没有成功。有任何想法吗?欢迎其他可行的解决方案。请记住,它必须是非 https 请求并且不在 /assets/ 路径中。谢谢!
只需将您的主服务器设置为仅侦听 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 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 文件上遇到问题,并且您需要发送额外的 headers 以允许来源要求。我们选择通过 http 将静态资产提供给云端,以避免必须在 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;
}
}
在 nginx 中,我试图找出处理重定向的最佳方法,当且仅当流量不在 /assets/* 路径中时,强制所有非 https 流量到 https。
用例:使 javascript 和 css 能够通过 AWS CloudFront 进行缓存,而无需从服务器链接 SSL 证书。
这是我正在尝试的:
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_redir' 括在引号中,但没有成功。有任何想法吗?欢迎其他可行的解决方案。请记住,它必须是非 https 请求并且不在 /assets/ 路径中。谢谢!
只需将您的主服务器设置为仅侦听 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 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 文件上遇到问题,并且您需要发送额外的 headers 以允许来源要求。我们选择通过 http 将静态资产提供给云端,以避免必须在 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;
}
}