
Preciso de uma maneira de redirecionar clientes quando nenhum caminho existente estiver definido. Quando coloco uma configuração de retorno 301, o nginx parece ignorar qualquer configuração de local. Ele redireciona tudo.
O nome do host no redirecionamento precisa ser dinâmico (vindo do cliente). Esses servidores são, na verdade, contêineres e são implantados em ambientes Dev/Prod. Portanto, o URL do cliente muda de algo como dev.example.com para example.com. Prefiro não trocar configurações com base em ambientes.
Estou usando a v1.18 no RHEL. Os servidores com proxy são aplicativos Angular gerenciados por seus respectivos desenvolvedores.
server {
listen 80;
server_name _;
index index.html;
location = /service/a {
proxy_pass http://svc-a.local/service/a/;
}
location /service/a/ {
proxy_pass http://svc-a.local/service/a/;
}
location = /service/b {
proxy_pass http://svc-b.local/service/b/;
}
location /service/b/ {
proxy_pass http://svc-b.local/service/b/;
}
location = /service/x {
proxy_pass http://svc-x.local/service/x/;
}
location /service/x/ {
proxy_pass http://svc-x.local/service/x/;
}
location = /home {
proxy_pass http://home.local/home/;
}
location /home/ {
proxy_pass http://home.local/home/;
}
# kubernetes probes this, but fails getting 301
location /nginx_status {
stub_status on;
acccess_log off;
}
# IF NO MATCH FROM ABOVE THEN GO TO /HOME
# try #1
return 301 http://$host/home/;
# try #2
location = / {
return 301 http://$host/home/;
}
# try #3
return 301 /home/;
# try #4
location = / {
proxy_pass http://home.local/home/;
}
}
Responder1
A return 301
regra, quando estiver fora de qualquer bloco de localização, será aplicada a todo o bloco do servidor e terá precedência sobre os blocos de localização. Em vez disso, você pode definir um bloco de localização padrão/substituto, como na tentativa nº 2, mas sem o sinal de igual ( =
). O sinal de igual especifica uma correspondência exata e, em vez disso, você deseja uma correspondência de prefixo para que corresponda a todas as solicitações.
Por exemplo:
server {
listen 80;
server_name _;
index index.html;
location = /service/a {
proxy_pass http://svc-a.local/service/a/;
}
location /service/a/ {
proxy_pass http://svc-a.local/service/a/;
}
location /service/b/ {
proxy_pass http://svc-b.local/service/b/;
}
location = /service/x {
proxy_pass http://svc-x.local/service/x/;
}
location /service/x/ {
proxy_pass http://svc-x.local/service/x/;
}
location = /home {
proxy_pass http://home.local/home/;
}
location /home/ {
proxy_pass http://home.local/home/;
}
# kubernetes probes this, but fails getting 301
location /nginx_status {
stub_status on;
acccess_log off;
}
# IF NO MATCH FROM ABOVE THEN GO TO /HOME
location / {
return 301 http://$host/home/;
}
}