Puteți face acest lucru în felul următor folosind mod_rewrite:
RewriteEngine Pornit
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(my-page)$ /$1/%1/%2 [QSD,R=302,L]
Primul condiție surprinde valoarea de p1 și trece asta celui de-al doilea condiție care captează și valoarea de p2. Acestea sunt apoi folosite în substituţie sfoară ca %1 și %2 respectiv backreferences.
Parametrii URL pot apărea în orice ordine.
@ (în a doua condiție) este doar un caracter arbitrar care nu apare în v1 și astfel este folosit ca delimitator între v1 și șirul de interogare la căutare p2.
Toți ceilalți parametri URL (de ex. p3..pN) sunt ignorate (și aruncate).
Ambii p1 și p2 trebuie să existe cu o valoare nevidă pentru ca redirecționarea să aibă loc.
ACTUALIZAȚI: p1 trebuie să existe cu o valoare nevide (în caz contrar, redirecționarea rezultată va fi ambiguă). p2 trebuie să existe, dar valoarea poate fi gol. De asemenea, am actualizat regex-ul, astfel încât să permită și un șir de interogare probabil incorect (dar încă valid) unde delimitatorul parametrului URL (&) apare înainte p2 chiar la începutul șirului de interogare. de exemplu. /pagina-mea?&p2=&p1=v1 ar fi în continuare redirecționat către /pagina-mea/v1/.
The QSD flag elimină șirul de interogare original din cerere.
În funcție de locul în care sunt utilizate aceste directive (de ex. director sau Server context) și cum este direcționată în cele din urmă adresa URL, poate fi necesar să adăugați un condiția inițială pentru a se asigura că sunt procesate numai cererile directe (spre deosebire de cererile rescrise).
De exemplu, adăugați următoarele ca primă condiție, dacă este necesar:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
ACTUALIZAȚI:
p1 și p2 sunt obligatorii. p3 este opțional.
Puteți modifica cele de mai sus după cum urmează:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# Ori p3 este obligatoriu și trebuie să aibă o valoare
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [SAU]
# SAU p3 este omis sau nu are o valoare
RewriteCond %1/%2 (.+)
RewriteRule ^/?(my-page)$ /$1/%1%2 [QSD,R,L]
A doua condiție asigură acum că există o valoare pentru p2 parametru (ex. v2) - nu poate fi gol.
Apoi, fie a treia condiție verifică dacă nu este gol p3 parametru SAU a 4-a condiție pur și simplu captează valorile atunci când p3 parametrul este fie gol, fie omis cu totul.
Redirecționarea rezultată omite slash-ul final când p3 nu este prezent. De exemplu, redirecționarea rezultată este fie /mypage/v1/v2 sau /mypage/v1/v2/v3. (Bară oblică care ar putea apărea altfel pe /mypage/v1/v2/ este evitat.)
In final substituţie șir, valorile lui %1 și %2 referințele din spate sunt puțin diferite de înainte. Acestea nu mai conțin fiecare valoare (de ex. v1 și v2). In schimb %1 conţine v1/v2 și %2 conţine fie /v3 (inclusiv prefixul slash) sau is gol (când p3 este gol sau omis).