web-dev-qa-db-fra.com

Comment rediriger sur le même port de http vers https avec le proxy inverse nginx

J'utilise un proxy inverse avec Nginx et je veux forcer la demande en HTTPS, donc si un utilisateur veut accéder à l'url avec http, il sera automatiquement redirigé vers HTTPS.

J'utilise également un port non standard.

Voici ma configuration de proxy inverse 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;
    }
}

J'ai essayé beaucoup de choses et j'ai également lu des articles à ce sujet, y compris cette question de défaut de serveur , mais rien n'a fonctionné jusqu'à présent.

37
rbinsztock

J'ai trouvé quelque chose qui fonctionne bien:

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

Êtes-vous sûr que votre solution fonctionne? Il écoute 8001 ssl. Acceptera-t-il la demande http?

Je le fais de cette façon:

server {
    listen   80;
    server_name  yourhostname.com;

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

Alors va votre 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;
    }
}
4
Yuri Golobokov

Cela a fonctionné pour moi:

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

...
}
1
sameer_v

Vous pouvez

  1. utilisez $ server_name pour éviter à nouveau de coder en dur votre nom de domaine (DRY),
  2. utilisez return 301 pour une lecture un peu plus facile (un développeur web doit connaître ce code de statut http)

Remarque: j'ai mis 443 pour le serveur https. Vous pouvez écouter 8001 si vous le voulez vraiment.

server {
    listen   80;
    server_name  your_hostname.com;

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