Cuando busco esta URL: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) lo recibe tal cual:
GET /foo/%5B-%5D HTTP/1.1
Sin embargo, cuando proxy esta aplicación a través de nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
La misma solicitud enrutada a través del puerto nginx se reenvía con la ruta decodificada:
GET /foo/[-] HTTP/1.1
Los corchetes decodificados en la ruta GET están causando los errores en el servidor de destino ( Estado HTTP 400 - Carácter ilegal en la ruta ... ) cuando llegan sin escapar.
¿Hay alguna manera de deshabilitar la decodificación de URL o codificarla de nuevo para que el servidor de destino obtenga exactamente la misma ruta cuando se enruta a través de nginx? ¿Alguna regla inteligente de reescritura de URL?
Respuestas:
Citando a Valentin V. Bartenev (quién debería obtener el crédito completo por esta respuesta):
fuente
http://localhost:8080/
ahttp://localhost:8080
por si alguien tiene la misma situación que yo.Tenga en cuenta que la decodificación de URL, comúnmente conocida como
$uri
"normalización" dentro de la documentación de nginx, ocurre antes del IFF de fondo:o cualquier URI se especifica dentro de
proxy_pass
sí mismo, incluso si solo la barra inclinada final por sí misma,o, URI se cambia durante el procesamiento, por ejemplo, a través de
rewrite
.Ambas condiciones están explícitamente documentadas en http://nginx.org/r/proxy_pass (el énfasis es mío):
La solución es omitir el URI como en el caso de los OP, o, de hecho, usar una
rewrite
regla inteligente :Puede verlo en vivo en una respuesta de desbordamiento de pila relacionada , incluido el grupo de control.
fuente
http://localhost:8080
). Si no está de acuerdo, puede hablar con los autores de RFC 3986.