Puncte:1

Ar trebui să scap de bara oblică „/” în RewriteCond?

drapel cn

Dacă trebuie să scap de bara oblică „/” din RewriteCond?

În prezent scriu următoarea regulă în .htaccess:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

Cu toate acestea, acest lucru funcționează numai pentru URL-uri precum https://www.datanumen.com/fi/customer/index.php?rp=/knowledgebase/7/How-to-order-the-full-version-of-DataNumen-Access-Repair.html&language=swedish, dar nu funcționează pentru URL ca https://www.datanumen.com/fi/customer/index.php?rp=%2Fknowledgebase%2F7%2FHow-to-order-the-full-version-of-DataNumen-Access-Repair.html&language=swedish

Deci, trebuie să modific regula, după cum urmează:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/ [SAU]
RewriteCond %{QUERY_STRING} rp=%2Fknowledgebase%2F
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

Dar verific https://serverfault.com/a/968916/280923 si spunea "Bara oblică (/) nu trebuie să fie eliminată". Deci sunt confuz.

Dacă trebuie să iau în considerare toate situațiile, adică versiunea cu evadare și versiunea fără escape a lui „/”, atunci ar trebui să existe în total 4 combinații, dacă le adaug pe toate ca RewriteCond:

rp=/bază de cunoștințe/
rp=%2Fbază de cunoștințe%2F
rp=%2Fbază de cunoștințe/
rp=/knowledgebase%2F
Puncte:1
drapel kz

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]
alancc avatar
drapel cn
Mulțumesc foarte mult. Acum înțeleg asta.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.