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).