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?
Je pense que le proxy_set_header
directive pourrait aider:
location / {
proxy_pass http://my_app_upstream;
proxy_set_header Host $Host;
# ...
}
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;
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/
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;
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;
}
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é
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.