Tengo un par de puntos finales API que quiero servir desde una sola ubicación /api
con subrutas que van a puntos finales diferentes. Específicamente, quiero que webdis esté disponible en /api
y una API patentada disponible en /api/mypath
.
No me preocupan los conflictos con la API webdis porque estoy usando subrutas que es poco probable que entren en conflicto con los nombres de los comandos de redis, y también tengo control total sobre el diseño de la API para evitar conflictos.
Aquí está el archivo de configuración de mi servidor de prueba que he estado pirateando:
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/;
#}
}
¿Cómo puedo cambiar mi solución para que cualquier solicitud /api/mypath/*
vaya al punto final en el puerto 3936 y todo lo demás al puerto 7379?
nginx
reverse-proxy
hamstar
fuente
fuente
tried this to no avail
? ¿Qué pasó cuando habilitas esa directiva de ubicación? ¿El tiempo de conexión expiro? ¿Ubicación no coincidente?Respuestas:
No necesita reescribir para esto.
De acuerdo con la documentación de nginx
Por lo tanto, cualquier solicitud que comience
/api/mypath/
siempre será atendida por el segundo bloque, ya que es la ubicación de prefijo más larga .Cualquier solicitud que comience
/api/
sin un seguimiento inmediatomypath/
siempre será atendida por el primer bloque, ya que el segundo bloque no coincide, por lo que el primer bloque es la ubicación de prefijo de coincidencia más larga .fuente
=
,~*
,~
, y^~
) que pueda parecer contrario a la intuición de que^~
se excluyen las expresiones regulares (ya que~
indica una coincidencia de expresiones regulares) ... Sin embargo, si usted recuerda,^
dentro de una clase de caracteres de expresiones regulares (por ejemplo[^a-z]
) niega que clase (de modo que el ejemplo significa (cualquier carácter excepto los de az); de manera similar,^~
niega cualquier posible bloque de ubicación de expresión regular.OK lo descubrí, pensé que el error "no encontrado" provenía de nginx, pero en realidad provenía de mi API. Esta es mi solución si alguien está interesado:
fuente