web-dev-qa-db-fra.com

Comment conserver l'URL de la requête avec nginx proxy_pass

J'essayais d'utiliser Thin serveur d'applications et j'ai eu un problème.

Quand nginx mandataires la demande à Thin (ou Licorne) en utilisant proxy_pass http://my_app_upstream; l'application reçoit l'URL modifiée envoyée par nginx (http://my_app_upstream).

Ce que je veux, c'est transmettre l'URL d'origine et la demande d'origine du client sans aucune modification, car l'application en dépend fortement.

Le nginx ' doc dit:

S'il est nécessaire de transmettre l'URI sous la forme non traitée, la directive proxy_pass doit être utilisée sans partie de l'URI.

Mais je ne comprends pas comment configurer cela exactement car l'échantillon associé utilise en réalité l'URI:

location  /some/path/ {
  proxy_pass   http://127.0.0.1;
}

Pourriez-vous donc m'aider à comprendre comment conserver l'URL de la demande d'origine du client?

65
Dmytrii Nagirniak

Je pense que le proxy_set_header directive pourrait aider:

location / {
    proxy_pass http://my_app_upstream;
    proxy_set_header Host $Host;
    # ...
}
108
yibe

Juste proxy_set_header hôte $ hôte manque port pour mon cas. Résolu par:



    location / {
     proxy_pass http://BACKENDIP/;
     include /etc/nginx/proxy.conf;
    }

puis dans le proxy.conf



    proxy_redirect off;
    proxy_set_header Host $Host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

10
GKislin

Pour transmettre parfaitement sans couper le absoluteURI de la requête et le Host dans l'en-tête:

server {
    listen 35005;

    location / {
        rewrite            ^(.*)$   "://$http_Host$uri$is_args$args";
        rewrite            ^(.*)$   "http$uri$is_args$args" break;
        proxy_set_header   Host     $Host;

        proxy_pass         https://deploy.org.local:35005;
    }
}

Trouvé ici: https://opensysnotes.wordpress.com/2016 11/17/nginx-proxy_pass-with-absolute-url/

3
Velkan

nginx fournit également la variable $ http_Host qui passera le port pour vous. c'est une concaténation d'hôte et de port.

Alors tu as juste besoin de faire:

proxy_set_header Host $http_Host;
3
user6880399

Si quelque chose modifie l'emplacement que vous essayez de servir, par exemple try_files, cela conserve la demande pour le back-end:

location / {
  proxy_pass http://127.0.0.1:8080$request_uri;
}
1
Walf

Dans mon scénario, j'ai fait cela via le code ci-dessous dans la configuration de nginx vhost

server {
server_name dashboards.etilize.com;

location / {
    proxy_pass http://demo.etilize.com/dashboards/;
    proxy_set_header Host $http_Host;
}}

$ http_Host définira l'URL dans l'en-tête comme demandé

1
Mansur Ali

Note aux autres personnes qui constatent ceci: Le cœur de la solution pour que nginx ne manipule pas l'URL consiste à supprimer la barre oblique à la fin de la directive Copy: proxy_pass. http: // my_app_upstream vs http: // my_app_upstream / - Hugo Josefson

J'ai trouvé cela ci-dessus dans les commentaires mais je pense que cela devrait vraiment être une réponse.

0