Перенаправление всего HTTP-трафика на HTTPS кажется невозможным - PullRequest
0 голосов
/ 22 февраля 2019

Я отправляю вопрос, потому что предыдущие попытки оказались тщетными.

У меня есть сервер rails, использующий nginx, и я пытаюсь перенаправить весь трафик 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 Плохой запрос Простой 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, как в текущей конфигурации (с прослушиванием 80 по умолчанию прокомментированный сервер).Это приводит к ошибке слишком большого числа перенаправлений.

Я попытался просто перенаправить ВСЕ трафик на https, включая проверку работоспособности.GCE ожидает ответа 200 и вместо этого получает 301, отмечая таким образом машину как нездоровую и делая приложение бесполезным.

Я также попробовал ssl on; в конфигурации сервера https, тот же результат (400)

Я также попытался переключить config.force_ssl = true в проекте rails, но безрезультатно.Любое другое решение, которое я пробую, тоже терпит неудачу.

Кто-нибудь тоже сталкивался с этим?

1 Ответ

0 голосов
/ 22 февраля 2019

Кажется, проблема была не в конфиге Nginx, а в сертификатах.Размещение действующего сертификата привело меня к созданию бэкэнда https и проверки работоспособности.Теперь все работает нормально.

...