Eu tenho alguns pontos de extremidade da API que desejo servir em um único local, /api
com subcaminhos indo para pontos de extremidade diferentes. Especificamente, quero que os webdis estejam disponíveis em /api
e uma API proprietária disponível em /api/mypath
.
Não estou preocupado com conflitos com a API webdis porque estou usando subcaminhos que dificilmente colidirão com nomes de comando redis e também tenho controle total sobre o design da API para evitar conflitos.
Aqui está o arquivo de configuração do meu servidor de teste no qual eu tenho invadido:
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/;
#}
}
Como posso alterar minha solução alternativa para que quaisquer solicitações /api/mypath/*
sejam encaminhadas para o terminal na porta 3936 e tudo mais para a porta 7379?
nginx
reverse-proxy
hamstar
fonte
fonte
tried this to no avail
? O que aconteceu quando você habilita essa diretiva de local? Tempo limite de conexão? O local não corresponde?Respostas:
Você não precisa reescrever isso.
De acordo com a documentação nginx
Portanto, qualquer solicitação que comece com
/api/mypath/
será sempre atendida pelo segundo bloco, pois esse é o local do prefixo correspondente mais longo .Qualquer solicitação que comece com
/api/
não imediatamente seguida pormypath/
sempre será atendida pelo primeiro bloco, já que o segundo bloco não corresponde, tornando o primeiro bloco o local do prefixo correspondente mais longo .fonte
=
,~*
,~
e^~
) que possa parecer contra-intuitivo que^~
exclui as expressões regulares (uma vez que~
indica uma expressão regular) ... No entanto, se você se lembra,^
dentro de uma classe de caracteres regex (por exemplo[^a-z]
) nega que classe (de modo que o exemplo significa (qualquer caractere, exceto os de az); da mesma forma,^~
nega quaisquer possíveis blocos de localização de expressões regulares.OK, entendi, pensei que o erro "não encontrado" vinha do nginx, mas na verdade era da minha API. Esta é a minha solução se alguém estiver interessado:
fonte