web-dev-qa-db-fra.com

pass conditionnel du proxy nginx

je suis en train de configurer nginx pour pouvoir transmettre la requête à un autre serveur, que si la variable request_body de $ correspond à une expression régulière spécifique.

Mon problème est maintenant, que je ne sais pas comment configurer ce comportement exactement.

Je suis actuellement à celui-ci:

server {
    listen 80 default;
    server_name test.local;

    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $http_Host;

            if ($request_body ~* ^(.*)\.test) {
                    proxy_pass http://www.google.de;
            }

            root /srv/http;
    }

}

mais le problème est ici, cette racine a toujours le upperhand. le proxy ne sera pas passé de toute façon.

une idée sur la façon dont je pourrais y arriver?

merci d'avance

16
sharpner

essaye ça:

server {
    listen 80 default;
    server_name test.local;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_Host;

        if ($request_body ~* ^(.*)\.test) {
            proxy_pass http://www.google.de;
            break;
        }

        root /srv/http;
    }

}
14
user973254

Le routage Nginx est basé sur la directive location qui correspond à l'URI de la demande. La solution consiste à le modifier temporairement afin de transmettre la demande à différents points de terminaison.

server {
    listen 80 default;
    server_name test.local;

     if ($request_body ~* ^(.*)\.test) {
         rewrite ^(.*)$ /istest/$1;
     }

     location / {
         root /srv/http;
     }

     location /istest/ {
        rewrite ^/istest/(.*)$  $1 break;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $http_Host;
        proxy_pass http://www.google.de;

    }
}

La condition if ne peut être utilisée en toute sécurité dans Nginx qu'avec le module rewrite dont elle fait partie. Dans cet exemple rewrite préfixe l'URI de la requête avec istest.

Les blocs location donnent la priorité à la correspondance la plus proche. Tout ce qui correspond à /istest/ ira au deuxième bloc qui utilise une autre rewrite pour supprimer /istest/ de l'URI de la demande avant de le transférer au proxy en amont.

0
Steve E.