web-dev-qa-db-fra.com

Redirection de proxy inverse Nginx

J'utilise nginx comme proxy inverse et lorsque je me connecte dans mon interface Web, je suis redirigé vers l'URL proxy. Je voudrais l'éviter et garder toujours le "nom_serveur" comme URL. C'est possible?

C'est mon /etc/nginx/conf.d/my_app.conf:

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

Je me connecte sur http://my-app.net, entrez les informations de connexion, je suis ensuite redirigé vers http://ip_of_the_app:7180 sur la même page de connexion et je dois me reconnecter. Cette double connexion peut-elle être évitée?

14
tonio94

Ne pas fixer proxy_redirect à off, cela ne fait pas ce que vous pensez qu'il fait. proxy_redirect effectue quelque chose de similaire à la réécriture d'URL, par exemple:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$Host/sales/; 
}

Cela vous permet d'héberger le /sales/ chemin ailleurs. Mais même dans ce cas, les paramètres par défaut de proxy_redirect faites exactement cela pour vous gratuitement. La valeur par défaut est de rediriger l'emplacement vers ce qui est présent dans proxy_pass (et les paramètres par défaut sont utilisés lorsque vous ne définissez pas proxy_redirect du tout, ou utilisez proxy_redirect default;).

Vous n'avez pas besoin de définir proxy_redirect.


Ce qui vous manque, ce sont des en-têtes qui doivent être envoyés à l'application. Le plus important d'entre eux est Host. Cela effectuera le mandataire comme vous le souhaitez et conservera l'URL correcte dans le navigateur.

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header Host $Host;
}

Notez que l'application sur http://ip_of_the_app:7180/ recevra désormais la demande avec le Host: my-app.net entête.


Vous devriez également envisager d'utiliser quelques en-têtes supplémentaires:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

Cela permettra une meilleure connexion à l'intérieur de l'application sur http://ip_of_the_app:7180/. X-Forwarded-For donnant l'IP du client réel (par opposition à nginxs IP) et X-Forwarded-Proto pour vérifier si le client s'est connecté au nginx via HTTP ou HTTPS.

27
grochmal