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.