【问题标题】:Redirect all HTTP traffic to HTTPS seems to be impossible将所有 HTTP 流量重定向到 HTTPS 似乎是不可能的
【发布时间】:2019-07-16 08:55:33
【问题描述】:

我发布这个问题是因为之前的尝试被证明是徒劳的。

我有一个使用 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 ^/(.*)$ /$1 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 普通 HTTP 请求被发送到 HTTPS 端口

您可能会注意到 /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 无济于事。我尝试的所有其他解决方案也都失败了。

有没有人也发现了这个?

【问题讨论】:

  • 我还尝试创建一个 https 健康检查以直接进入 https 部分。检查不起作用,使我的机器不健康。更不用说只能在 https 后端执行 https 检查了。

标签: ruby ruby-on-rails-3 nginx http-redirect nginx-config


【解决方案1】:

似乎问题不是 Nginx 配置,而是证书。 放置一个有效的证书让我创建了一个 https 后端和健康检查。现在一切正常。

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2016-07-27
    • 2012-04-19
    • 2015-03-01
    • 1970-01-01
    • 2014-08-23
    • 2013-01-06
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多