Ar trebui să scap de slash /
în RescrieCond
?
Prin „escape the slash”, vrei să spui cu adevărat „ar trebui să potrivesc cu o adresă oblică codificată sau nu?”. Acest lucru depinde în întregime de solicitarea HTTP făcută către serverul dvs.
Dar verific https://serverfault.com/a/968916/280923 și scria „Slash (/
) nu trebuie scăpat". Deci sunt confuz.
Întrebarea/răspunsul asociat nu are legătură cu problema actuală. Această întrebare se ocupă de scăpările backslash în directivele/regex Apache, nu URL-urile codificate în URL (sau %-codate) cu care aveți de-a face aici. Acestea sunt două tipuri foarte diferite de metode de „scăpare” în scopuri diferite.
Ceea ce aveți de-a face sunt adrese URL codificate în %. Cum apare adresa URL în solicitarea HTTP. Diferite părți ale unei adrese URL (în special „calea” și „șirul de interogare”) au cerințe de codificare diferite. Fie că un anumit personaj are nevoie a fi codificat în % depinde dacă altfel ar avea o semnificație specială în acel context.
După cum este definit în RFC3986, slash (/
) nu trebuie strict codificată în % în partea șirului de interogare a adresei URL. Cu toate acestea, funcțiile de codificare URL (cum ar fi PHP și JavaScript) vor codifica adesea acest caracter. (Cred că acest lucru este în mare măsură istoric, deoarece unele implementări vechi nu au gestionat corect o bară oblică necodificată - referință RFC3986.)
Cu toate acestea, indiferent dacă un personaj are nevoie pentru a fi codificat URL (pentru a anula semnificația sa specială), orice caracter poate fi codificat în %, iar acesta ar trebui tratat la fel ca caracterul literal (necodat).
Indiferent dacă trebuie sau nu să te potrivești /
(decodificat) sau %2F
(codificat) depinde dacă acel caracter este sau nu %-codat în cerere.
Problema ta este că ȘIR DE INTEROGARE
variabila de server nu este %-decodificată, spre deosebire de calea URL care este potrivită de RewriteRule
model.
Dar... trebuie să verificați atât pentru %-decodificat /
și %-codat %2F
? Probabil că conectați în mod constant doar la una sau la alta URL (canonică). Prin urmare, orice solicitare către adresa URL non-canonică ar trebui să fie introdusă manual sau să fie conectată în mod eronat de către o terță parte. Primiți solicitări la amândoi? Care sunt consecințele neredirecționării adresei URL non-canonice?
În caz contrar, da, ar trebui să verificați ambele (și eventual toate variantele/cazurile). Deși probabil asta va fi doar /bază de cunoștințe/
sau %2Fbază de cunoștințe%2F
. Dar rețineți că ar putea fi %2F
(majuscule) sau %2f
(minuscule). Majuscule este doar o convenție. Trebuie să verificați dacă există o codificare mixtă, cum ar fi %2Fbază de cunoștințe/
ar trebui să fie foarte rar. Dar luată la extremă, aceasta este și aceeași ca %2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f
. Dacă ar trebui să gestionați toate aceste variații depinde de probabilitatea de a primi o astfel de solicitare și de severitatea regulii care nu se potrivește.
Deci, să se potrivească pe ambele /bază de cunoștințe/
și %2Fbază de cunoștințe%2F
(insensibil la majuscule și minuscule) ați putea folosi ceva de genul:
RewriteCond %{QUERY_STRING} ^rp=(/|%2[Ff])bază de cunoștințe(/|%2[Ff])
Ai putea evita clasa de caractere [Ff]
și folosiți NC
flag în schimb pentru a face ca întreaga comparație să nu țină seama de majuscule și minuscule. De exemplu:
RewriteCond %{QUERY_STRING} ^rp=(/|%2F)bază de cunoștințe(/|%2F) [NC]
Pe Apache 2.4 puteți utiliza unscape()
funcția într-o expresie Apache cu RescrieCond
directivă pentru a decoda URL-ul ȘIR DE INTEROGARE
înainte de a face comparația. Cu toate acestea, acest lucru nu vă ajută cu adevărat, deoarece nu decodifică %-slash-uri, de exemplu. %2F
sau %2f
rămâne conform cererii (dar orice alte caractere sunt %-decodate). De exemplu:
RewriteCond expr „unescape(%{QUERY_STRING}) =~ m#^rp=(/|%2[Ff])bază de cunoștințe(/|%2[Ff])#”
Acest lucru v-ar permite să vă potriviți rp=%2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f
.
Sau, dacă nu vă așteptați la niciun caracter codificat URL în șirul de interogare, puteți pur și simplu să blocați orice solicitare care trimite oricare! De exemplu, următoarele ar trebui să meargă în partea de sus a configurației dvs.:
# Blocați orice solicitare care include un caracter %-codat în șirul de interogare
RewriteCond %{QUERY_STRING} %[\da-f]{2} [NC]
RewriteRule ^ - [R=400]