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.
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.
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 ...;
}
}
...
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;
}
}
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;
}
}
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;
}