Excludează o cale din WordPress folosind redirectări .htaccess (Apache)

26 iun. 2019, 19:25:03
Vizualizări: 6.18K
Voturi: 3

Doresc să exclud o cale care se potrivește cu o regulă din încărcarea WordPress. Modul normal în care aș aborda această problemă este folosind flag-ul final [L] într-o regulă înaintea tuturor celorlalte.

Pentru a păstra lucrurile simple în acest exemplu, voi pretinde că vreau să potrivesc o cale simplă /foo/.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^foo/?$ - [L]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Totuși, aceasta nu funcționează. Câteva alte opțiuni sunt sugerate în acest post mai vechi de pe Stack Overflow, dar niciuna dintre ele nu funcționează (nici pentru mine, nici pentru alții în comentariile acelui post).

Am încercat și această condiție de rescriere în locul regulii:

RewriteCond %{REQUEST_URI} ^/?(foo/.*)$

Precum și adăugarea ErrorDocument 401 default la sfârșitul documentului .htaccess.

8
Comentarii

Cum anume nu funcționează? WordPress afișează pagina sa de eroare 404?

Sally CJ Sally CJ
27 iun. 2019 05:49:07

Da, redirecționarea pur și simplu eșuează, deci dacă pagina există, merge la /foo, iar dacă pagina nu există, afișează 404-ul temei. Practic regula nu împiedică WordPress să fie rutat.

Orun Orun
27 iun. 2019 16:26:38

De fapt, primesc și eu eroarea 404, dar asta ar trebui să fie rezultatul așteptat în cazul meu, deoarece calea (/foo) nu există și rescrierea nu este redirecționată către niciun script. Încearcă să dezactivezi pluginurile și/sau să încerci o temă implicită? Edit: Adică, văd pagina implicită de eroare servită de Apache și nu de WordPress.

Sally CJ Sally CJ
27 iun. 2019 16:35:56

Am încercat cu toate pluginurile dezactivate și tema twenty-nineteen (tema mea este personalizată oricum și nu folosesc multe pluginuri). Totuși, fără succes. Care regulă din cele de mai sus folosești? RewriteRule ^foo/?$ - [L]? Unde în secvența de citire .htaccess ai pus-o?

Orun Orun
27 iun. 2019 20:15:22

Da, RewriteRule ^foo/?$ - [L] și am pus-o exact în același loc ca în întrebare - sub RewriteEngine On. Dar acel bloc IfModule este singurul conținut al fișierului meu .htaccess. Ar putea fi o problemă de caching? Încearcă să șterghi cache-ul browserului și al site-ului și să încerci și cu un alt browser, poate ajută?

Sally CJ Sally CJ
27 iun. 2019 20:42:57

Nu ar trebui să fie caching pentru că toate acestea ar trebui să fie pe partea de server. Dar, de asemenea, am încercat o regulă aleatorie și funcționează, deci regulile .htaccess funcționează în acel fișier. Am încercat să elimin totul și tot fără succes. Sunt doar curios, ce versiune de Apache rulezi? Poți să execuți apache2 -v sau httpd -v?

Orun Orun
27 iun. 2019 21:02:38

Nu, nu pot, nu pe acel server. Dar rulez Apache/2.4.26 (Red Hat). Și pe un alt server (httpd -v = Apache/2.4.39 (Unix)), regula de rescriere a funcționat de asemenea.

Sally CJ Sally CJ
28 iun. 2019 02:33:07

Mulțumesc pentru testare, trebuie să fie ceva în configurația mea apache

Orun Orun
28 iun. 2019 15:49:59
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 3
0

Ar trebui să folosești RewriteCond în loc de RewriteRule. Folosește acest lucru:

RewriteCond %{REQUEST_URI} !/foo/

De exemplu, codul complet ar putea arăta astfel:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !/foo/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
2 iul. 2019 14:01:33
3

O mică problemă este că va trebui să actualizați RewriteRule ./ în penultima linie. Iată un fragment actualizat (și testat) pentru dumneavoastră:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/foo/.*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ./ /index.php [L]
</IfModule>

# END WordPress

Am testat ambele:

Sper că vă ajută!!

2 iul. 2019 14:10:13
Comentarii

Asta a fost, mulțumesc. Deși nu sunt sigur de ce . nu ar fi putut să corespundă cu ./, ar fi trebuit să se potrivească cu ambele. Pentru oricine altcineva care întâmpină această problemă în viitor: am optimizat ușor prin schimbarea la ./? și am creat un serviciu rapid pentru a verifica fișierul .htaccess și a mă asigura că unele pluginuri sau actualizări nu l-au suprascris/resetat.

Orun Orun
2 iul. 2019 21:07:28

@Orun nu este o idee bună să configurezi un serviciu care să interzică modificarea fișierului. în schimb, doar acea parte ar trebui monitorizată, deoarece multe pluginuri utile scriu alte blocuri, care nu ar trebui interzise.

T.Todua T.Todua
4 iul. 2019 20:01:33

Da, sunt de acord. Fișierul este încă complet modificabil. De fapt, aveam deja un serviciu care scrie propriul meu bloc în .htaccess în cadrul temei mele, așa că doar l-am extins. Acesta caută doar o anumită linie, o modifică dacă o condiție este îndeplinită și apoi înregistrează modificarea într-un jurnal special.

Orun Orun
5 iul. 2019 17:21:46
2

Următoarea regulă funcționează pentru mine

RewriteRule ^(foo)($|/) - [L]

adică, orice cale care începe cu foo precum /foo/, /foo/bar/ sau orice altceva, duce la eroarea 404 a Apache în loc de eroarea 404 a temei; cu presupunerea că nu există un director real cu această cale.

Regula trebuie să fie înaintea ultimei linii standard a blocului WordPress:

RewriteRule . /index.php [L]

Și nu contează cu adevărat dacă este după RewriteBase /, poate fi înaintea acesteia; anterior a fost formulată pripit și neglijent din partea mea.

Ceea ce v-ar oferi șansa de a lăsa blocul dintre # BEGIN WordPress și # END WordPress neatins, dacă doriți să faceți acest lucru. Prin plasarea

<IfModule mod_rewrite.c>
RewriteRule ^(foo)($|/) - [L]
</IfModule>

înaintea # BEGIN WordPress.

S-ar putea să doriți să preveniți crearea căii /foo/ în WordPress, acest lucru mi-a venit în minte:

add_filter( 'wp_unique_post_slug', 'no_more_foo_wp_unique_post_slug', 2, 6 );
function no_more_foo_wp_unique_post_slug( 
  $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug 
) {
  if ( $post_parent === 0 ) {
    $pattern = '/^foo$/';
    $replace = 'bar';
    $slug   = preg_replace( $pattern, $replace, $slug );
  }
  return $slug;
}
2 iul. 2019 15:11:38
Comentarii

Ai dreptate, ar fi trebuit să setez regula după baza, nu sunt sigur de ce am făcut-o înainte în acest post! De fapt, în fișierul .htaccess de producție era setată după. Mulțumesc că ai menționat totuși. A fost o omisiune din partea mea când am editat markdown-ul aici.

Orun Orun
5 iul. 2019 17:23:45

@Orun Am clarificat puțin răspunsul meu.

Nicolai Grossherr Nicolai Grossherr
5 iul. 2019 19:58:45