Redirection de proxy inverse Nginx

14

J'utilise nginxcomme proxy inverse et lorsque je me connecte dans mon interface Web, je suis redirigé vers l'URL proxy. Je voudrais l'éviter et toujours garder 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 http://my-app.net, saisis les informations de connexion, je suis ensuite redirigé vers http://ip_of_the_app:7180la même page de connexion et je dois me reconnecter. Cette double connexion peut-elle être évitée?

tonio94
la source
tonio94, votre problème a-t-il été résolu? si oui, veuillez accepter la réponse. si non, veuillez clarifier ce qui manque.
cnst
2
Je viens de le tester hier, cela fonctionne, proxy_redirect doit être supprimé. Merci pour l'aide.
tonio94

Réponses:

26

Ne vous mettez pas proxy_redirectà off, ce n'est pas faire ce que vous pensez qu'il fait. proxy_redirecteffectue 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_redirectfont exactement cela pour vous gratuitement. La valeur par défaut est de rediriger l'emplacement dans tout 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_redirectdu tout, ou utilisez proxy_redirect default;).

Vous n'avez pas besoin de régler 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 proxy 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 http://ip_of_the_app:7180/recevra désormais la demande avec l'en- Host: my-app.nettê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-Fordonnant l'IP du client réel (par opposition à l' nginxIP s) et X-Forwarded-Protopour vérifier si le client s'est connecté à nginxvia HTTP ou HTTPS.

grochmal
la source
Merci de votre aide. proxy_redirect n'est pas nécessaire mais proxy_set_header Referer ip_of_the_app: 7180 doit être défini pour fonctionner correctement.
tonio94
@ tonio94 - Merci, j'ai mis à jour la réponse. Notez que l'utilisation normale de Refererest simplement celle $http_refererqui le copie de la requête. Cela ne fonctionne pas si la demande n'a pas d'en-tête Referer, donc le codage en dur est une solution dans certains cas.
grochmal
@JonathanKomar - Merci pour cela, vous avez raison, maintenant édité. Désolé, il m'a fallu un certain temps pour remarquer votre commentaire.
grochmal
@grochmal Merci, vous m'avez sauvé la vie avec ces informations sur: proxy_set_header HOST $ host;
Obay Abd-Algader