
Necesito una forma de redirigir a los clientes cuando no se define ninguna ruta existente. Cuando pongo una configuración de retorno 301, nginx parece ignorar cualquier configuración de ubicación. Redirige todo.
El nombre de host en la redirección debe ser dinámico (proviene del cliente). Estos servidores son en realidad contenedores y se implementan en entornos de desarrollo/producción. Entonces la URL del cliente cambia de algo como dev.example.com a example.com. Prefiero no intercambiar configuraciones según los entornos.
Estoy usando v1.18 en RHEL. Los servidores proxy son aplicaciones Angular administradas por sus respectivos desarrolladores.
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/;
}
}
Respuesta1
La return 301
regla, cuando esté fuera de cualquier bloque de ubicación, se aplicará a todo el bloque del servidor y tendrá prioridad sobre los bloques de ubicación. En su lugar, podría definir un bloque de ubicación predeterminado/alternativo, como en el intento n.º 2, pero sin el signo igual ( =
). El signo igual especifica una coincidencia exacta y, en su lugar, desea una coincidencia de prefijo para que coincida con todas las solicitudes.
Por ejemplo:
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/;
}
}