Puncte:1

Ce înseamnă %{REQUEST_FILENAME}.ext? De ce finalul suplimentar .ext?

drapel dj

The %{REQUEST_FILENAME} conține un șir ca acesta:

/web/webroot/index.php

Văd că mulți oameni recomandă testarea dacă un fișier există și are o extensie .php ca aceasta:

RewriteCond %{REQUEST_FILENAME}.php -f

Nu este .php după %{REQUEST_FILENAME} redundant? Variabila ar trebui să conțină deja .php, dreapta?

Pare să adaugi .php după %{REQUEST_FILENAME} ar face verificarea TestString să adauge un .php suplimentar, astfel:

/web/webroot/index.php.php

Imi scapa ceva simplu, sunt sigur de asta, dar pur si simplu nu stiu ce este.

Contextul este acesta:

RewriteCond %{THE_REQUEST} ^.*?\.php [NC]
RewriteRule ^ - [R=404,NE,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]
Puncte:1
drapel kz

Nu este .php după %{REQUEST_FILENAME} redundant? Variabila ar trebui să conțină deja .php, dreapta?

Ei bine, da și nu, depinde ce încerci să faci.

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_FILENAME}.php [L]

Această regulă vă permite să solicitați adrese URL fără extensie. de exemplu. /index sau /foo iar aceasta rescrie intern cererea către /index.php și /foo.php respectiv.

In aceasta instanta, REQUEST_FILENAME este un șir de formă /web/webroot/index. Deci, asta testează /web/webroot/index.php există înainte de a rescrie la același. Dacă ar fi să ceri /index.php apoi cel condiție eșuează și nu are loc nicio rescriere (ceea ce este corect).

Cu toate acestea, această regulă nu este strict corectă și poate provoca o buclă de rescriere în anumite condiții. Vezi următoarea întrebare legată:

Jeff avatar
drapel dj
Văd că știi lucrurile tale. Mă voi uita la asta încă câteva ore până îmi voi da seama. Cred că spui că variabila este modificată prin adăugarea `.ext`, dar nu găsesc acest comportament documentat nicăieri decât pe forumurile SE. EDIT: Da, bine, am înțeles. Mulțumiri!
drapel kz
@Jeff Variabila în sine (adică `REQUEST_FILENAME`) nu este modificată, doar _TestString_ (primul argument al directivei `RewriteCond`) - așa cum ați afirmat în întrebare. Practic, testează dacă URL-ul solicitat + `.php` există ca fișier fizic.Deși, `REQUEST_FILENAME` nu este strict variabila corectă de utilizat aici (deși funcționează în _majoritatea_ cazurilor), așa cum este menționat în întrebarea legată. (`REQUEST_FILENAME` este „fișierul” la care se mapează adresa URL solicitată.)
Jeff avatar
drapel dj
Ei bine, din moment ce, desigur, vreau să folosesc variabilele strict corecte în codul meu, aceasta este aceea: `%{DOCUMENT_ROOT}%{REQUEST_URI}.php -f`?
drapel kz
@Jeff Da, și modificați șirul de _substituție_ `RewriteRule` în consecință. adică. `RewriteRule ^ %{REQUEST_URI}.php [L]`
Jeff avatar
drapel dj
Minunat, multumesc mult!
drapel kz
@Jeff Expresia regex `!\.\w{2,4}$` exclude toate solicitările care includ deja ceea ce _arata ca_ o extensie de fișier. Este doar o optimizare, pentru a preveni toate resursele statice (imagini, CSS, JS, etc) să fie testate inutil pentru a vedea dacă `image.jpg.php` există etc. (verificările sistemului de fișiere sunt relativ costisitoare). Fișierele nu au _normal_ două extensii de fișiere precum `exists.qqq.php`, așa că în mod normal nu ar fi o problemă. Dar este doar o optimizare, așa că este sigur de eliminat. Puteți obține o optimizare similară excluzând subdirectorul în care sunt stocate toate activele dvs. statice.
Jeff avatar
drapel dj
Lucruri bune. Linia `RewriteCond` dinaintea expresiei regex de excludere nu exclude deja toate acele teste suplimentare pentru celelalte resurse statice (pe lângă fișierele .html)?
drapel kz
@Jeff Directiva `RewriteRule` este procesată mai întâi. Numai când _patternul_ `RewriteRule` se potrivește sunt procesate _condițiile_ precedente. Dacă _patternul_ `RewriteRule` nu are succes, întreaga regulă este omisă și procesarea continuă...
Jeff avatar
drapel dj
Wow, nu știam asta. Multumesc din nou!

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.