Lorsque je navigue vers cette URL: http://localhost:8080/foo/%5B-%5D
server ( nc -l 8080
) le reçoit tel quel:
GET /foo/%5B-%5D HTTP/1.1
Cependant, lorsque je proxy cette application via nginx (1.1.19):
location /foo {
proxy_pass http://localhost:8080/foo;
}
La même demande acheminée via le port nginx est transmise avec le chemin décodé:
GET /foo/[-] HTTP/1.1
Les crochets décodés dans le chemin GET sont à l'origine des erreurs sur le serveur cible ( état HTTP 400 - caractère illégal dans le chemin ... ) car ils arrivent sans échappement.
Existe-t-il un moyen de désactiver le décodage d'URL ou de le recoder afin que le serveur cible obtienne exactement le même chemin lorsqu'il est acheminé via nginx? Une règle de réécriture d'URL intelligente?
Réponses:
Citant Valentin V. Bartenev (qui devrait obtenir le crédit complet pour cette réponse):
la source
http://localhost:8080/
pourhttp://localhost:8080
au cas où quelqu'un aurait la même situation que moi.Notez que le décodage d'URL, communément appelé
$uri
"normalisation" dans la documentation de nginx, se produit avant l'IFF backend:soit n'importe quel URI est spécifié en
proxy_pass
lui-même, même si seule la barre oblique de fin est isolée,ou, l'URI est modifié pendant le traitement, par exemple, via
rewrite
.Les deux conditions sont explicitement documentées sur http://nginx.org/r/proxy_pass (c'est moi qui souligne):
La solution consiste soit à omettre l'URI comme dans le cas des PO, soit à utiliser une
rewrite
règle intelligente :Vous pouvez le voir en direct dans une réponse Stack Overflow associée , y compris un groupe de contrôle.
la source
http://localhost:8080
). Si vous n'êtes pas d'accord, vous pouvez le reprendre avec les auteurs de la RFC 3986.