Comment suivre les redirections HTTP à l'intérieur de Nginx?


15

J'ai un proxy HTTP basé sur nginx et je voudrais traiter toutes les redirections HTTP à l'intérieur afin que les clients n'obtiennent que la dernière réponse de la chaîne de redirection.

Le code de base ressemble à:

location /proxy {
    rewrite ^/proxy/([^/]+) $1 break;

    proxy_pass http://$uri/;
}

Ma tentative de suivre les redirections de niveau 1 est la suivante:

error_page 301 302 307 =200 @redir;

... et ayant cet emplacement nommé:

location @redir {
    proxy_pass $proxy_location;
}

Seulement, il n'y a pas de variable $ proxy_location et je n'ai pas trouvé de moyen de la créer. Il doit contenir la valeur de l'en- Location:tête reçue de l'amont.

Des pensées?

Réponses:


7

Je pense que vous voulez la variable $ upstream_http_location .

Les variables qui commencent par $ proxy * contrôlent ce qui va de nginx à l'amont. La série de variables $ upstream * contient des informations sur la réponse que nginx lui-même reçoit. Vous pouvez obtenir n'importe quel en-tête HTTP aribitrary reçu d'un serveur en amont avec $ upstream_http_headername.

Notez que ces variables $ en amont ne peuvent être que nulles jusqu'à ce que la réponse soit reçue du serveur en amont, il y a donc quelques limitations à leur utilisation.


26

Voici l'exemple complet de ce qui a fonctionné pour moi:

server {
    ...

    location / {
        proxy_pass http://backend;
        # You may need to uncomment the following line if your redirects are relative, e.g. /foo/bar
        #proxy_redirect / /;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }
}

1
Pourquoi avez-vous dû enregistrer la valeur de $ upstream_http_location dans une nouvelle variable?
Parth Shah

1
Je ne connais pas la raison exacte, mais cela ne fonctionne pas autrement ...
Vlad Frolov

C'est très bien mais n'attrape qu'une seule redirection. Est-il possible de gérer plusieurs redirections?
ThiefMaster

1
@ThiefMaster Je crois que cette réponse est ce que vous recherchez.
iBug

Je reçois l'erreur suivante en 2020/01/23 09:17:46 [error] 1394#0: *1 invalid URL prefix in "", client: xx.xx.28.3, server: www.example.com, request: "GET /test HTTP/1.1", host: "www.example.com"utilisant le bloc @handle_redirect, une idée?
Cyril Duchon-Doris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.