nginx riscrive per un URL con parametri


16

Ho un URL di questo tipo:

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

E voglio reindirizzarlo a questo:

http://www.example.com/newparam/val3/val4

Quindi ho provato questa regola di riscrittura senza successo:

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

Nginx non è in grado di gestire i parametri della query?

EDIT: non voglio riscrivere tutte le petizioni. Devo solo riscrivere quell'URL, senza influire sugli altri.

Risposte:


15

Ok, grazie all'aiuto iniziale di rzab, ho ridefinito la sua regola a questa soluzione funzionante:

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

Ho appena aggiunto una condizione per evitare la ricorsione infinita e un? alla fine della regola per sbarazzarsi dei parametri iniziali . Funziona perfettamente :)


1
La stringa di query consente un diverso ordine di parametri. Così il vostro ifsmetterà di funzionare quando ad esempio, param2va davanti param1.
Alexander Azarov,

Interessante. Nel mio caso non accadrà perché è un URL cliccabile in un'e-mail, ma è bene saperlo. Grazie.
David Morales,

4
posizione = / {
  riscrivi ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

Quindi, devo scrivere $ arg_ e quindi il nome del parametro?
David Morales,

Sì, sarebbe il più semplice.
Martin Fjordvald,

Ok, ma non voglio riscrivere tutte le petizioni. Devo solo riscrivere quell'URL, senza influire sugli altri.
David Morales,

Ho fatto alcuni test. Tale regola genererà un reindirizzamento infinito. Scriverò una nuova risposta con il codice che ho avuto modo di lavorare. Grazie :)
David Morales,

Dovrei probabilmente menzionare che devi dichiarare "location /" oltre a "location = /" per evitare la ricorsione. Immagino che lo avrai per proxy_pass da qualche parte come percorso principale. "location = /" corrisponde esattamente a / richieste. Ad ogni modo, la corrispondenza di $ args sembra ok, tranne per il fatto che corrisponderà a qualsiasi richiesta con i parametri? Param1 = val1 & ....
rzab
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.