web-dev-qa-db-fra.com

NGinx Proxy par la méthode de demande

Est-il possible/Comment puis-je configurer un bloc d'emplacement NGinx à proxy à différents backends en fonction de la méthode de la demande (c.-à-d. Obtenir/post)?

La raison en est que je gère actuellement les 2 méthodes de 2 URL différentes (une via proxy HTTP et l'autre via FCGI) et essayons de le rendre plus "repos" de sorte que, irait parfaitement à l'obtention de la ressource pour renvoyer la liste , pendant que l'affichage sur la même ressource devrait ajouter à la liste.

19
Brenton Alker

Je n'utilise pas cette configuration, mais basée sur les exemples ici :

location /service  {
  if ($request_method = POST ) {
    fastcgi_pass 127.0.0.1:1234;
  }

  if ($request_method = GET ) {
     alias /path/to/files;
  }
}

Si vous écriez votre propre application, vous pouvez également envisager de vérifier Get/Poster et envoyer X-Accel-redirect en-têtes pour remettre le transport des fichiers vers NGinx.

28
Jason

Bien que vous puissiez y parvenir avec if, cela est généralement découragé par la documentation Nginx , car if ne joue pas bien avec les autres directives. Par exemple, supposons que GET devrait être ouvert pour tout le monde, tandis que POST est uniquement destiné aux utilisateurs authentifiés, à l'aide de HTTP Basic Auth. Cela nécessiterait if à combiner avec auth_basic, qui ne fonctionne pas correctement.

Voici une alternative qui fonctionne sans if. L'astuce consiste à utiliser "GET" et "POST" dans le cadre des noms amont, celles-ci peuvent donc être traitées par substitution variable:

http {
  upstream other_GET {
    server ...;
  }
  upstream other_POST {
    server ...;
  }
  server {
    location /service {
      proxy_pass http://other_$request_method;
    }
  }
}

Pour le combiner avec HTTP Basic Auth pour tout mais obtenez, il suffit d'ajouter un limit_except Block:

  ...
    location /service {
      proxy_pass http://other_$request_method;
      limit_except GET {
        auth_basic ...;
      }
    }
  ...
24
vog

Je ne pouvais pas obtenir la réponse de @timmmmmmy pour travailler, mais cela m'a pointé sur la Documentation sur la carte et cela a fonctionné pour moi:

map $request_method $upstream_location {
   PUT     example.com:8081;
   POST    example.com:8081;
   PATCH   example.com:8081;
   default example.com:8082;
}
server {
   location / {
      proxy_pass https://$upstream_location;
   }
}
0
rik harris

Légère modification de la réponse de Vog pour inclure un gestionnaire par défaut pour d'autres méthodes telles que des options, mettre, etc.

    upstream webdav_default {
            server example.com;
    }
    upstream webdav_upload {
            server example.com:8081;
    }
    upstream webdav_download {
            server example.com:8082;
    }
    server {
            map upstream_location $request_method {
                    GET     webdav_download;
                    HEAD    webdav_download;
                    PUT     webdav_upload;
                    LOCK    webdav_upload;
                    default webdav_default;
            }
            location / {
                    proxy_pass https://$upstream_location;
            }
    }
0
timmmmmy

C'est ce que j'ai fait pour faire des choses travailler pour moi

add_header Allow "GET, POST, HEAD" always;
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
    proxy_pass http://back-end;
}
0
Mansur Ali