O nome contén a palabra redirect, así que se pega dentro dun bloque location cando non se pode alcanzar un backend detrás da VPN. Nada cambia, e a conclusión obvia é que a directiva está rota ou necesita outra sintaxe. O que ocorreu é máis simple e menos halagador: proxy_redirect actúa sobre unha resposta que xa volveu, e neste despregamento ningunha petición chegou tan lonxe.

Dúas directivas, dous momentos nunha petición

Unha petición HTTP a través dun proxy inverso pasa por varias decisións en orde, e as dúas directivas viven en extremos opostos desa secuencia. Unha elixe a onde vai a petición. A outra edita certas cabeceiras na resposta que volve.

DirectiveWhen it actsWhat it can change
proxy_passBefore any bytes leave the proxyWhich upstream receives the request
proxy_redirectAfter the upstream respondsMatching Location and Refresh text

Esa orde é toda a resposta. Se a segunda fila nunca se executa porque a primeira fallou, a segunda directiva non está mal configurada, simplemente é inalcanzable. Por moito que reescribas a segunda liña, non crearás a resposta que debía editar. Diagnostica desde a primeira fila cara a fóra, e o comportamento confuso resólvese nunha ruta que falta ou nunha conexión rexeitada.

Escoller o upstream corresponde a proxy_pass

Supoñamos que NGINX se executa nun host de entrada público e pode alcanzar unha aplicación en 10.40.0.20:8080 pola súa VPN. O fragmento que escolle esa aplicación ten este aspecto, dentro dun bloque server existente:

location / {
    proxy_pass http://10.40.0.20:8080;
}

Usa o esquema, o enderezo e o porto reais, e trata isto como un fragmento e non como un despregamento. O host de entrada tamén debe manter a ruta da VPN, un camiño de reenvío permitido e tráfico de retorno funcional cara a ese servizo, porque un proxy que alcanza un enderezo sobre o papel aínda necesita que o núcleo estea de acordo.

A referencia do módulo proxy mantén a selección do upstream separada da reescritura de cabeceiras de resposta, e sinala que un valor proxy_pass que contén un URI cambia como se substitúe o prefixo de location coincidente. Engadir ou quitar compoñentes da ruta sen comprobar a URL que a aplicación espera é unha forma fiable de producir un 404 que parece un fallo de encamiñamento.

proxy_redirect arranxa respostas que filtran un enderezo privado

Unha vez que flúe o tráfico, un backend pode responder cunha cabeceira Location que nomea o seu enderezo privado. Un navegador que segue esa cabeceira abandona o punto de entrada público e tenta alcanzar algo que non pode resolver. Unha reescritura de resposta configurada a propósito mapea a URL privada sobre a pública:

proxy_redirect http://10.40.0.20:8080/ https://app.example.com/;

Substitúe ambos os lados por valores reais. Entende tamén o alcance estreito: reescríbese o texto das cabeceiras Location e Refresh que coinciden, pero as URL incrustadas en HTML, JavaScript ou ficheiros descargados non.

Se unha aplicación constrúe ligazóns absolutas en todas partes, a solución duradeira é a súa propia configuración de URL externa, non unha lista crecente de regras de reescritura no proxy. Engadir regras ata que a saída pareza correcta produce unha configuración que falla na primeira páxina que ninguén probou. Un só axuste correcto da aplicación substitúe toda a colección.

Que non pode reparar unha reescritura de cabeceira

Varios problemas adxacentes parecen problemas de redirección e non o son. A cabeceira Host enviada ao upstream pode ter que coincidir co host virtual do backend. Un upstream TLS pode necesitar un nome de servidor concreto máis verificación do certificado, e reescribir unha cabeceira de resposta non axuda en ningún dos dous casos.

O alcance das cookies e os atributos de dominio pertencen á aplicación e á súa configuración. Un proxy pode descartar ou reescribir cabeceiras todo o día e aínda así producir unha sesión que falla na segunda petición, porque a cookie se emitiu para un host que o navegador nunca visitou. Ese fallo parece intermitente, e por iso sobrevive tanto tempo nunha cola de tíckets. Ler o dominio da cookie normalmente remata a investigación nun minuto.

Mantén tamén a autenticación e a selección de backend limitadas á aplicación prevista. Un proxy inverso público debería expor unha soa aplicación a través da VPN do servidor en lugar de converterse nunha pasarela xenérica cara a cada enderezo privado que ese host poida alcanzar. Un único location xenérico que reenvía todo o que pide o solicitante converte un servizo exposto nun mapa da túa rede privada. Nomea o upstream explicitamente e déixao aí.

Proba na orde na que viaxa a petición

Confirma tres cousas en secuencia: NGINX escolleu o location previsto, completou unha petición ao backend e o navegador seguiu calquera redirección posterior e cargou os subrecursos. Cada paso ten as súas propias liñas de log, e lelas en orde converte un 502 vago nun achado concreto.

A distinción que necesitas é entre unha conexión de upstream fallida e un navegador enviado a un nome privado inalcanzable. A primeira aparece no log de erros do proxy; a segunda aparece como unha petición que nunca chega, co navegador queixándose dun host que non pode resolver. Dous problemas distintos, dous ficheiros distintos, e só un deles ten algo que ver con proxy_redirect.

Artigos relacionados