1 votes

Comment rediriger une requête HTTP en fonction d'un paramètre d'URL ?

Nous exécutons deux conteneurs Jetty dans des hôtes différents (Host-P, Host-Q). L'un des conteneurs est déployé avec quelques applications (App-A, App-B, App-C). Un autre conteneur qui a également quelques applications (App-X, App-Y, App-Z).

Host-P => App-A,App-B,App-C
Host-Q => App-X,App-Y,App-Z

myapp.test.com est l'hôte primaire accessible par le client web. Mon client web est conscient de l'application qui doit être invoquée. Je passe ce type d'application dans le paramètre URL. L'URL sera comme suit

http://myapp.test.com/?=appType=App-A
http://myapp.test.com/?=appType=App-B

http://myapp.test.com/?=appType=App-Y
http://myapp.test.com/?=appType=App-X

Où je dois configurer la logique de routage basée sur les paramètres de l'URL. Puis-je avoir tomcat/nginx s'exécutant en myapp.test.com hôte qui ne fera que du routage ? Quel fichier de configuration dois-je consulter ?

2voto

Michael Hampton Points 232226

Si le paramètre de la requête fait référence à un conteneur auquel vous pouvez vous adresser directement, vous pouvez simplement le passer à la fonction proxy_pass directement, par exemple :

        proxy_pass http://$arg_appType;

Mais c'est utiliser des données non fiables et c'est aussi une énorme faille de sécurité. Considérez ?appType=www.google.com . Je montre ceci comme un exemple de ce que pas à faire.


Au lieu de cela, utilisez un map pour faire correspondre les paramètres de la requête aux destinations :

map $arg_appType $destination {
    App-A http://container1:8443;
    App-B http://container2:5000;
    App-X http://container24:9001;
    App-Y https://some.remote.host;
}

Maintenant vous pouvez proxy_pass directement à elle.

         proxy_pass $destination;

Mais vous devez également intercepter la situation dans laquelle une inconnue ou aucun appType a été donné.

    if ($destination = "") {
        return 403;    # or do something else appropriate
    }

Si vous avez un conteneur spécifique pour gérer ce scénario, vous pouvez utiliser default dans le map pour l'envoyer à la place.

map $arg_appType $destination {
    ....
    default http://error-handler-container:8000;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X