Подтвердить что ты не робот

Как перенаправить на тот же порт с http на https с обратным прокси-сервером nginx

Я использую обратный прокси с Nginx, и я хочу заставить запрос в HTTPS, поэтому, если пользователь хочет получить доступ к URL-адресу с http, он будет автоматически перенаправлен на HTTPS.

Я также использую нестандартный порт.

Вот моя конфигурация обратного прокси nginx:

server {
    listen 8001  ssl;
    ssl_certificate /home/xxx/server.crt;
    ssl_certificate_key /home/xxx/server.key;
    location / {
        proxy_pass https://localhost:8000;
        proxy_redirect off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header  X-Forwarded-Proto  https;
    }
}

Я пробовал много вещей, а также читал сообщения об этом, в том числе this serverfault вопрос, но пока ничего не сделано.

4b9b3361

Ответ 1

Нашел что-то, что хорошо работает:

server {
        listen 8001  ssl;
        ssl_certificate /home/xxx/server.crt;
        ssl_certificate_key /home/xxx/server.key;
        error_page 497  https://$host:$server_port$request_uri;
        location /{
            proxy_pass http://localhost:8000;
            proxy_redirect off;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Ssl on;
        }
}

Ответ 2

Вы уверены, что ваше решение работает? Он слушает 8001 ssl. Будет ли он принимать HTTP-запрос?

Я делаю так:

server {
    listen   80;
    server_name  yourhostname.com;

    location / {
            rewrite ^(.*) https://yourhostname.com:8001$1 permanent;
    }
}

Затем идет ваш config:

server {
    listen 8001  ssl;
    ssl_certificate /home/xxx/server.crt;
    ssl_certificate_key /home/xxx/server.key;
    location / {
        proxy_pass https://localhost:8000;
        proxy_redirect off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header  X-Forwarded-Proto  https;
    }
}

Ответ 3

Вы можете

  • используйте $server_name, чтобы избежать жесткого кодирования вашего доменного имени (DRY),
  • используйте return 301 для более легкого чтения (веб-разработчик должен знать этот код состояния http).

Примечание. Я поставил 443 для https-сервера. Вы можете слушать 8001, если вы действительно этого хотите.

server {
    listen   80;
    server_name  your_hostname.com;

    return 301 https://$server_name$request_uri;
}
...
server {
    listen 443 ssl;
    server_name your_hostname.com
    ...
}