2015-07-07 8 views
5

Ich habe nginx location Direktive, die Zweck ist "Lokalisierung" Präfix von der URI für die proxy_pass Direktive zu entfernen.Nginx - Codierung (Normalisierung) Teil der URI

Zum Beispiel machen URI http://example.com/en/lalala Verwendung proxy_pass http://example.com/lalala

location ~ '^/(?<locale>[\w]{2})(/(?<rest>.*))?$' { 
     ... 
     proxy_pass http://example/$rest; 
     ... 
} 

Auf diese Weise die rest Variable dekodiert werden, wenn an proxy_pass directeve weitergegeben. Es scheint ein erwarteter behavior zu sein.

Das Problem ist, wenn meine URI %20 von Client übergeben codierten Raum enthält

http://example.com/lala%20lala 

nginx URI decodiert

http://example.com/lala lala 

ich es in meinem error.log sehen kann.

Die Frage ist - ist es möglich, kodierte rest Variablen irgendwie zu verwenden, wie es vom Client übergeben wird? Wenn ich etwas völlig falsch mache, bitte, schlagen Sie den richtigen Weg vor.

Vielen Dank.

Antwort

6

Ja, dieses Verhalten zu erwarten, obwohl docs sagt auch:

Wenn proxy_pass ohne URI angegeben wird, die Anforderungs-URI an den Server in der gleichen Form übergeben wird, wie durch einen Client gesendet, wenn die ursprüngliche Anforderung verarbeitet wird oder die vollständige normalisierte Anforderungs-URI übergeben wird, wenn die geänderte URI Verarbeitung:

location /some/path/ { 
    proxy_pass http://127.0.0.1; 
} 

Nginx Ingenieure sagen das gleiche: https://serverfault.com/questions/459369/disabling-url-decoding-in-nginx-proxy

Allerdings, wenn Sie $ request_uri proxy_pass (und Streifen locale anhängen vorher kann es als said von Nginx Ingenieur arbeiten):

set $modified_uri $request_uri; 

if ($modified_uri ~ "^/([\w]{2})(/.*)") { 
set $modified_uri $1; 
} 

proxy_pass http://example$modified_uri; 
+0

vielen Dank. Ich wusste über $ request_uri, aber mein derzeitiges Wissen über nginx erlaubte mir nicht, den URI richtig zu modifizieren. –

+0

Beachten Sie, dass wenn Sie $ request_uri verwenden, IT NICHT ÄNDERN wird, wenn eine interne Umleitung vorgenommen wird, z. B. wenn eine Umschreibung ausgeführt wird oder eine error_page-Direktive angewendet wird. Nur $ uri ändert sich in diesen Fällen, aber $ uri ist bereits dekodiert, so dass es nicht als generischer Ersatz für $ request_uri verwendet werden kann. –

4

Ich habe einen gewissen Erfolg hatte folgendes mit Confluence und anderen Atlassian Anwendungen hinter nginx denen Sonderzeichen wie() <> [] wurden verursacht Probleme mit.

location /path { 
    # [... other proxy options ...] 

    # set proxy path with regex 
    if ($request_uri ~* "/path(/.*)") { 
    proxy_pass http://server:port/path$1; 
    break; 
    } 

    # fallback (probably not needed) 
    proxy_pass http://server:port/path; 
} 
+0

Vielen Dank. Dies endete 2 Tage der Turture :) –