Pentru că, din moment ce redirecționarea este necondiţionat, ajungi să redirecționezi din nou după URL-ul a fost rescris index.php
(controlerul frontal WordPress).
Când solicitați /somepage.php
:
- Sunteți redirecționat către
/pe o pagină
(prin prima regulă). Răspunsul de redirecționare este trimis înapoi clientului.
- La a doua cerere,
/pe o pagină
este rescris intern la /index.php
după ultima regulă. Motorul de rescriere pornește apoi de la capăt (în a director context)...
/index.php
este redirecționat către /index
(prin prima regulă).Răspunsul de redirecționare este trimis înapoi clientului.
- La a treia cerere
/index
este rescris intern la /index.php
prin ultima rescriere. Motorul de rescriere pornește apoi de la capăt...
- Treci la 3 (blocat într-o buclă de redirecționare fără sfârșit).
Într-o director context (cum ar fi .htaccess
) motorul de rescriere nu face pur și simplu o singură trecere prin script. Se face buclă până când URL-ul trece neschimbat. (Cu excepția cazului în care utilizați Sfârşit
flag pe Apache 2.4 sau apare o redirecționare externă 3xx.)
Se schimbă pentru a elimina .html
funcționează OK pentru că rescrieți în /index.php
, care nu se termină în .html
, deci directiva de redirecționare (care elimină .html
) nu se potrivește.
Pentru a rezolva acest lucru, trebuie să evitați redirecționarea cererii rescrise. Puteți face acest lucru prin:
folosind Sfârşit
flag (Apache 2.4+) la ultima rescriere, în loc de L
pentru a preveni alte bucle ale motorului de rescrire. Deși ar trebui să evitați modificarea directivelor WordPress stoc (vezi mai jos), așa că aceasta poate să nu fie opțiunea preferată. Acest lucru nu funcționează nici pe Apache 2.2.
Sau, verificați pentru .php
prelungire împotriva CEREREA
variabila server (care conține linia inițială a antetelor cererii HTTP și nu se modifică atunci când cererea este rescrisă). De exemplu:
# Eliminați extensia „.php” numai pentru cererile „directe” (nu rescrise).
RewriteCond %{THE_REQUEST} [A-Z]{3,7}\s/[^?]+\.php(?:\?|\s|$) [NC]
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
Sau, verificați REDIRECT_STATUS
variabilă de mediu, care este goală la cererea inițială și setată la 200 (ca în starea HTTP 200 OK) la prima rescriere reușită (aceasta este mai simplă decât expresia regex destul de complexă de mai sus). De exemplu:
# Eliminați extensia „.php” numai pentru cererile „directe” (nu rescrise).
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ /$1 [R=301,L,NC]
Cu toate acestea, nu ar trebui să editați codul din interiorul # ÎNCEPE WordPress
secțiunea, deoarece WordPress însuși încearcă să mențină acest lucru și poate suprascrie acest cod mai târziu. Această regulă trebuie să meargă inainte de cel # ÎNCEPE WordPress
marcator de comentarii. Nu trebuie să repetați RewriteEngine Pornit
directivă care apare mai târziu în fișier (în secțiunea WordPress).
Va trebui să ștergeți memoria cache a browserului înainte de testare, deoarece redirecționarea eronată (permanentă) va fi probabil memorată în cache de browser. Testați mai întâi cu redirecționări 301 (temporare) pentru a evita problemele de stocare în cache.
Cu toate acestea, numai acest lucru nu vă permite să accesați .php
fișiere fără .php
extensie. Deoarece adresa URL fără extensie va trebui rescrisă intern înapoi la .php
fişier.