J'ai quelques points de terminaison d'API que je veux servir à partir d'un emplacement unique /api
avec des sous-chemins allant vers différents points de terminaison. Plus précisément, je veux que les webdis soient disponibles sur /api
et une API propriétaire disponible sur /api/mypath
.
Je ne m'inquiète pas des conflits avec l'API webdis car j'utilise des sous-chemins qui ne risquent pas de se heurter aux noms de commandes redis, et j'ai également un contrôle total sur la conception de l'API pour éviter les conflits.
Voici le fichier de configuration de mon serveur de test sur lequel je pirate:
server {
listen 80;
server_name localhost;
server_name 192.168.3.90;
server_name 127.0.0.1;
location / {
root /home/me/src/phoenix/ui;
index index.html;
}
# temporary hardcoded workaround
location = /api/mypath/about {
proxy_pass http://localhost:3936/v1/about;
}
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:7379/;
}
# tried this but it gives "not found" error
#location ^~ /api/mypath/ {
# rewrite ^/api/mypath/(.*)$ /$1 break;
# proxy_pass http://localhost:3936/v1/;
#}
#
#location ^~ /api {
# rewrite ^/api/(.*)$ /$1 break;
# proxy_pass http://localhost:7379/;
#}
}
Comment puis-je modifier ma solution de contournement pour que toutes les demandes /api/mypath/*
soient envoyées au point de terminaison sur le port 3936 et tout le reste sur le port 7379?
la source
tried this to no avail
? Que s'est-il passé lorsque vous activez cette directive d'emplacement? Délai de connection dépassé? L'endroit ne correspond pas?Réponses:
Vous n'avez pas besoin de réécrire pour cela.
Selon la documentation nginx
Par conséquent, toute demande commençant par
/api/mypath/
sera toujours traitée par le deuxième bloc, car il s'agit de l' emplacement de préfixe correspondant le plus long .Toute demande commençant par
/api/
non immédiatement suivie parmypath/
sera toujours traitée par le premier bloc, car le deuxième bloc ne correspond pas, ce qui fait du premier bloc l' emplacement de préfixe correspondant le plus long .la source
=
,~*
,~
et^~
) il peut sembler contre-intuitif qui^~
exclut les expressions régulières (car~
indique une correspondance d'expression régulière) ... Cependant, si vous vous souvenez, à l'^
intérieur d' une classe de caractères regex (par exemple[^a-z]
) annule que classe (telle que l'exemple signifie (n'importe quel caractère sauf ceux de az); de même,^~
annule tout bloc de localisation d'expression régulière potentiel.OK compris, je pensais que l'erreur "introuvable" provenait de nginx, mais en fait, elle provenait de mon API. C'est ma solution si quelqu'un est intéressé:
la source