2017-12-09 1 views
1

ich mit Karte neu zu schreiben möchte alsNginx Rewrite auf der Karte mit den Parametern

/oldpage?f=regist  -> /signup 
/oldpage?f=regist&a=1 -> /signup?a=1 
/oldpage?f=confirm  -> /signup?t=confirm 
/oldpage?f=confirm&a=1 -> /signup?t=confirm&a=1 

aber mein Redirect Ergebnis in nginx (v1.12.2) ist

/oldpage?f=regist  -> /signup?f=regist 
/oldpage?f=regist&a=1 -> Not Found 
/oldpage?f=confirm  -> /signup?t=confirm?f=confirm 
/oldpage?f=confirm&a=1 -> Not Found 

Ich habe nginx.conf as,

map $request_uri $rewrite_uri { 
    include conf.d/redirect.map; 
} 
server { 
    ... 
    if ($rewrite_uri) { 
     rewrite^$rewrite_uri redirect; 
    } 
} 

und redirect.map ist

/oldpage?f=regist /signup; 
/oldpage?f=confirm /signup?t=confirm; 

Es wäre sehr hilfreich, wenn Sie mir Ratschläge geben könnten.

Antwort

2

Wenn der Parameter a=1 andere Parameter darstellt und Sie diese Kombinationen nicht zur Map-Datei hinzufügen möchten, sollten Sie die Syntax Ihrer Map-Datei so ändern, dass sie reguläre Ausdrücke verwendet.

Die regulären Ausdrücke im Block map können benannte Erfassungen erstellen, die später in der Konfiguration verwendet werden können. Im folgenden Beispiel werden die Variablen $prefix und $suffix als Captures aus dem Block map bezeichnet.

Das folgende Beispiel hat einige Einschränkungen - da die $prefix und $suffix Werte leer sein kann, kann enthalten die erzeugten URIs ein ? oder & Hinter - die nicht die gesamte Semantik beeinflussen sollte.

Alle regulären Ausdrücke und die zugeordneten Werte haben ein gemeinsames Muster, um optionale Parameter zu erfassen und sie an den resultierenden Wert anzufügen.

map $request_uri $new { 
    default 0; 
    ~*^/oldpage\?(?<prefix>.*&)?f=regist(&(?<suffix>.*))?$ /signup?; 
    ~*^/oldpage\?(?<prefix>.*&)?f=confirm(&(?<suffix>.*))?$ /signup?t=confirm&; 
} 

server { 
    ... 
    if ($new) { 
     return 301 $new$prefix$suffix; 
    } 

Weitere Informationen finden Sie unter this document.