Nginx не может правильно пересылать протокол запроса вверх - программирование
Подтвердить что ты не робот

Nginx не может правильно пересылать протокол запроса вверх

У меня есть сайт в rails 4 beta. Он работает на Nginx + Unicorn. Я хочу, чтобы nginx пересылал протокол запроса ( "http" или "https" ) единорогу, чтобы я мог работать с ними. Однако я не могу заставить его работать.

Я положил <%= request.ssl? %> и <%= request.protocol %> в файл просмотра для тестирования. Мой конфигурационный файл сервера nginx выглядит следующим образом:

upstream unicorn {
  server unix:/tmp/unicorn.blog.sock fail_timeout=0;
}

server {
  listen 80;
  listen 443;
  server_name example.com;
  root /home/example;

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-Proto https;  # <--- Line 1
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Ssl on;       # <--- Line 2
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

Я обнаружил, что отмеченные 2 строки не действуют правильно. Вот мой результат теста:

=================

Строка 1 закомментирована, строка 2 тоже прокомментировала:

посетите http://the.url

<%= request.ssl? %>     : false
<%= request.protocol %> : http

посетите https://the.url

<%= request.ssl? %>     : false
<%= request.protocol %> : http

=================

Строка 1 закомментирована, строка 2 не является OR Строка 2 закомментировала, строка 1 не является OR Также нет комментариев.

посетите http://the.url

<%= request.ssl? %>     : true
<%= request.protocol %> : https

посетите https://the.url

<%= request.ssl? %>     : true
<%= request.protocol %> : https

=================

То есть, если появляется одна из этих двух строк, nginx пересылает "https" вверх по течению независимо от того, что представляет собой настоящий протокол. Но если ни одна из этих двух строк не появляется, nginx пересылает "http" вверх по течению независимо от того, что представляет собой фактический протокол.

Пожалуйста, кто-нибудь скажет мне, как написать файл конфигурации nginx, чтобы он мог правильно переслать протокол? Большое спасибо.

4b9b3361

Ответ 1

попробовать:

proxy_set_header X-Forwarded-Proto $scheme;

ИЛИ

server {
    Listen 80
    ...
}
server {
    Listen 443
    ...
    location @unicorn {
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Ssl on;
    }
}

Ответ 2

Вам нужно будет настроить два отдельных блока сервера. Один для HTTP и один для HTTPS. Это упростит настройку этих двух. Части, которые идентичны, вы можете включить в отдельный общий файл конфигурации.