O Nginx está sendo executado na porta 80 e estou usando-o para reverter URLs de proxy com caminho /foo
para a porta 3200
desta maneira:
location /foo {
proxy_pass http://localhost:3200;
proxy_redirect off;
proxy_set_header Host $host;
}
Isso funciona bem, mas eu tenho um aplicativo na porta 3200
, para o qual não quero que a inicial /foo
seja enviada. Ou seja - quando eu acessar http://localhost/foo/bar
, quero apenas /bar
ser o caminho recebido pelo aplicativo. Então, tentei adicionar esta linha ao bloco de localização acima:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Isso causa o redirecionamento 302 (alteração no URL), mas eu quero o 301. O que devo fazer?
nginx
reverse-proxy
301-redirect
jeffreyveon
fonte
fonte
Respostas:
Qualquer redirecionamento para o host local não faz sentido em um sistema remoto (por exemplo, navegador da Web do cliente). Portanto, os sinalizadores de reescrita permanente (301) ou redirecionado (302) não são utilizáveis no seu caso.
Tente seguir a configuração usando uma regra de reescrita transparente:
Use
curl -i
para testar suas reescritas. Uma mudança muito sutil na regra pode fazer com que o nginx execute um redirecionamento.fonte
/foo(.*)
, caso contrárioexample.com/foo
não será correspondido. (que é provavelmente o que jeffreyveon experiente)A correspondência simples de prefixo de local funciona para isso sem usar uma regra de reescrita, desde que você especifique um URI na diretiva proxy_pass:
Observe o adicional
/
no final daproxy_pass
diretiva. O NGINX retira o prefixo correspondente/foo
e passa o restante para o servidor back-end no URI/
. Portanto,http://myserver:80/foo/bar
será publicado no back-end emhttp://localhost:3200/bar
.A partir dos docs nginx sobre proxy_pass :
fonte
//xyz
para o host, se você fizer isso.A maneira mais correta e as melhores práticas absolutas são geralmente as seguintes:
Observe a extrema importância da barra final
proxy_pass
, que altera automaticamente a$uri
variável para que/foo/
o front-end corresponda/
ao back-end. Não há necessidade de umarewrite
diretiva explícita .Além disso, observe que o rastreamento
/
no site tambémlocation
é bastante importante - sem ele, você corre o risco de ter URLs de aparência estranha no site em um ponto (por exemplo, um trabalho/fooen
além de/foo/en
).Além disso, o rastreamento
/
nolocation
comproxy_pass
também garante um tratamento especial , conforme a documentação dalocation
diretiva, para efetivamente causar um implícitolocation = /foo {return 301 /foo/;}
também.Portanto, ao definir
location
a barra com a barra à direita, você não apenas garante que URLs com sufixo sem barra como/fooen
não sejam válidos, mas também que uma/foo
barra sem barra continue a funcionar também.Documentação de referência:
fonte
$args
estão perdidos:http://frontend/foo?bar=baz
serão enviados por proxyhttp://backend/
. Observe que args não são a parte url$args
que ainda deve ser tratado adequadamente se você usar o código acima, pois eles são separados$uri
e devem ser reunidos novamente, a menos que você esteja usando variáveis explícitas no seuproxy_pass
./foo
redirecionar/foo/
, portanto, a menos que você esteja fazendo algo estranho no back-end, até as/foo
solicitações ainda funcionarão com o código acima. (Esta é realmente já parte da resposta, BTW.)experimentar
ou
fonte
//xyz
para o host, se você fizer isso.@Terabuck Desculpe por não responder ainda não.
Você não deve usar o host local, pois depende do fato de o aplicativo estar sendo executado em um servidor com um arquivo de hosts. host local é apenas uma tradução padrão para 127.0.0.1. Não há nada indicando que você deve ter esses arquivos de hosts. É muito comum ter um.
Ter uma interface de loopback é outra coisa comum de se depender, mas você ainda depende da interface de loopback na pilha de rede. É um caso raro não ter esses dois. Se você se preocupar com isso. Pelo menos no unix / linux, você tem a opção de soquetes. Isso eliminará a necessidade de a pilha de rede alcançar o host local. Tenha cuidado com essa abordagem, pois existem alguns fatores que serão implementados no sistema operacional host. Como o número de arquivos abertos etc.
fonte