将所有 HTTP 流量重定向到 HTTPS 似乎是不可能的
Redirect all HTTP traffic to HTTPS seems to be impossible
我发布这个问题是因为之前的尝试被证明是徒劳的
我有一个使用 nginx 的 rails 服务器,我正在尝试将所有 http 流量重定向到 https。
这是我的 nginx.conf 文件:
upstream backend {
server unix:PROJECT_PATH/tmp/thin1.sock;
server unix:PROJECT_PATH/tmp/thin2.sock;
server unix:PROJECT_PATH/tmp/thin3.sock;
server unix:PROJECT_PATH/tmp/thin4.sock;
server unix:PROJECT_PATH/tmp/thin5.sock;
server unix:PROJECT_PATH/tmp/thin6.sock;
server unix:PROJECT_PATH/tmp/thin7.sock;
server unix:PROJECT_PATH/tmp/thin8.sock;
}
server {
listen 80 default_server;
listen 443 default_server ssl;
server_name app_name;
ssl_certificate path_to_certificate_file.crt;
ssl_certificate_key path_to_certificatefile.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
root PATH_TO_PUBLIC_FOLDER;
access_log path_to_project/log/access.log;
error_log path_to_project/log/error.log;
client_max_body_size 10m;
large_client_header_buffers 4 16k;
location /ping {
echo "pong"
return 200;
}
# Cache static content
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|swf|wav)$ {
expires max;
log_not_found off;
}
# Status, local only (accessed via ssh+wget)
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# double slash removal
set $test_uri $host$request_uri;
if ($test_uri != $host$uri$is_args$args) {
rewrite ^/(.*)$ / break;
}
location / {
if ($http_x_forwarded_proto = 'http') {
return 301 https://$server_name$request_uri;
}
try_files $uri @proxy;
}
location @proxy {
proxy_redirect off;
# Inform we are on SSL
proxy_set_header X-Forwarded-Proto https;
# force timeouts if one of backend is died
proxy_next_upstream error timeout invalid_header http_502 http_503;
# Set headers
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
error_page 500 502 503 504 /500.html;
}
当前配置导致:
400 Bad Request The plain HTTP request was sent to HTTPS port
您可能会注意到 /ping 位置。那是因为我在执行健康检查的 GCE 平衡器后面有服务器,这是唯一一个我不想重定向的服务器。其他所有内容都应重定向到 HTTPS。
之前的尝试:
server {
listen 80;
server_name app_name;
location /ping {
echo "pong";
return 200;
}
location / {
return 301 https://$server_name$request_uri;
}
}
与当前配置一样的 https 服务器部分(带有 listen 80 default_server 评论)。这会导致重定向错误太多。
我试图简单地将所有流量重定向到 https,包括健康检查。 GCE 期望 200 响应,但它得到的是 301,从而将机器标记为不健康并使应用程序无用。
我也在 https 服务器配置上尝试了 ssl on;
,结果相同 (400)
我也尝试在 rails 项目中切换 config.force_ssl = true 无济于事。我尝试的所有其他解决方案也都失败了。
有没有人也偶然发现了这个?
看来问题不是 Nginx 配置,而是证书。
放置一个有效的证书让我创建了一个 https 后端和健康检查。现在一切正常。
我发布这个问题是因为之前的尝试被证明是徒劳的
我有一个使用 nginx 的 rails 服务器,我正在尝试将所有 http 流量重定向到 https。
这是我的 nginx.conf 文件:
upstream backend {
server unix:PROJECT_PATH/tmp/thin1.sock;
server unix:PROJECT_PATH/tmp/thin2.sock;
server unix:PROJECT_PATH/tmp/thin3.sock;
server unix:PROJECT_PATH/tmp/thin4.sock;
server unix:PROJECT_PATH/tmp/thin5.sock;
server unix:PROJECT_PATH/tmp/thin6.sock;
server unix:PROJECT_PATH/tmp/thin7.sock;
server unix:PROJECT_PATH/tmp/thin8.sock;
}
server {
listen 80 default_server;
listen 443 default_server ssl;
server_name app_name;
ssl_certificate path_to_certificate_file.crt;
ssl_certificate_key path_to_certificatefile.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
root PATH_TO_PUBLIC_FOLDER;
access_log path_to_project/log/access.log;
error_log path_to_project/log/error.log;
client_max_body_size 10m;
large_client_header_buffers 4 16k;
location /ping {
echo "pong"
return 200;
}
# Cache static content
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|swf|wav)$ {
expires max;
log_not_found off;
}
# Status, local only (accessed via ssh+wget)
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# double slash removal
set $test_uri $host$request_uri;
if ($test_uri != $host$uri$is_args$args) {
rewrite ^/(.*)$ / break;
}
location / {
if ($http_x_forwarded_proto = 'http') {
return 301 https://$server_name$request_uri;
}
try_files $uri @proxy;
}
location @proxy {
proxy_redirect off;
# Inform we are on SSL
proxy_set_header X-Forwarded-Proto https;
# force timeouts if one of backend is died
proxy_next_upstream error timeout invalid_header http_502 http_503;
# Set headers
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://backend;
}
error_page 500 502 503 504 /500.html;
}
当前配置导致:
400 Bad Request The plain HTTP request was sent to HTTPS port
您可能会注意到 /ping 位置。那是因为我在执行健康检查的 GCE 平衡器后面有服务器,这是唯一一个我不想重定向的服务器。其他所有内容都应重定向到 HTTPS。
之前的尝试:
server {
listen 80;
server_name app_name;
location /ping {
echo "pong";
return 200;
}
location / {
return 301 https://$server_name$request_uri;
}
}
与当前配置一样的 https 服务器部分(带有 listen 80 default_server 评论)。这会导致重定向错误太多。
我试图简单地将所有流量重定向到 https,包括健康检查。 GCE 期望 200 响应,但它得到的是 301,从而将机器标记为不健康并使应用程序无用。
我也在 https 服务器配置上尝试了 ssl on;
,结果相同 (400)
我也尝试在 rails 项目中切换 config.force_ssl = true 无济于事。我尝试的所有其他解决方案也都失败了。
有没有人也偶然发现了这个?
看来问题不是 Nginx 配置,而是证书。 放置一个有效的证书让我创建了一个 https 后端和健康检查。现在一切正常。