Как перенаправить на тот же порт с 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;
    }
}

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

4 ответов


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

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;
        }
}

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

Я делаю это так:

server {
    listen   80;
    server_name  yourhostname.com;

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

затем идет ваша конфигурация:

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;
    }
}

вы можете

  1. используйте $server_name, чтобы избежать жесткого кодирования вашего доменного имени снова (DRY),
  2. используйте 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
    ...
}

это сработало для меня:

server {
listen       80;
server_name  localhost;
...
if ($http_x_forwarded_proto = "http") {
      return 301 https://$server_name$request_uri;
}
location / {
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:8080;
}

...
}