O Nginx está sendo executado na porta 80 e estou usando-o para reverter URLs de proxy com caminho /foo
para 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 em port 3200
, para o qual não quero que a inicial /foo
seja enviada. Ou seja - quando eu acesso http://localhost/foo/bar
, quero apenas /bar
ser o caminho conforme recebido pelo aplicativo. Então eu tentei adicionar esta linha ao bloco de localização acima:
rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
Isso causa redirecionamento 302 (mudança de URL), mas eu quero 301. O que devo fazer?
Qualquer redirecionamento para localhost não faz sentido a partir de um sistema remoto (por exemplo, navegador da Web do cliente). Portanto, os sinalizadores de reescrita permanente (301) ou redirecionamento (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.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 removerá o prefixo correspondente/foo
e passará o restante para o servidor de backend no URI/
. Portanto,http://myserver:80/foo/bar
postará no back-end emhttp://localhost:3200/bar
.Dos documentos NGINX em proxy_pass :
A maneira absolutamente mais correta e a melhor prática geralmente é a seguinte:
Observe a extrema importância da barra final em
proxy_pass
, que altera automaticamente a$uri
variável para que/foo/
o front-end corresponda/
ao backend.rewrite
Não há necessidade de uma diretiva explícita .Além disso, observe que o trailing
/
nolocation
também é muito importante - sem ele, você corre o risco de ter URLs de aparência estranha em seu site em um ponto (por exemplo, um trabalho/fooen
além de/foo/en
).Além disso, o trailing
/
nolocation
withproxy_pass
também garante algum tratamento especial , conforme a documentação dalocation
diretiva, para efetivamente causar um implícitolocation = /foo {return 301 /foo/;}
também.Portanto, definindo a
location
com a barra à direita como acima, você não apenas garante que os URLs de sufixo sem barra como/fooen
não sejam válidos, mas também que a/foo
sem barra à direita continuará a funcionar também.Documentação de referência:
tentar
ou
@Terabuck Desculpe por não responder nenhum representante ainda.
Você não deve usar localhost porque depende do fato de que o aplicativo está sendo executado em um servidor com um arquivo hosts. host local é apenas uma tradução padrão para 127.0.0.1. Não há nada informando 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 sockets. Isso eliminará a necessidade de a pilha de rede alcançar o localhost. 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.