Escludere un percorso da WordPress utilizzando i redirect in .htaccess (Apache)

26 giu 2019, 19:25:03
Visualizzazioni: 6.18K
Voti: 3

Vorrei escludere un percorso che corrisponde a una regola dall'avvio di WordPress. Il modo normale in cui affronterei questo problema è utilizzando il flag finale [L] in una regola prima di tutte le altre.

Per mantenere le cose semplici in questo esempio, farò finta di voler corrispondere a un percorso semplice /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>

Tuttavia, questo non funziona. Alcune altre opzioni sono suggerite in questo vecchio post di Stack Overflow, ma nessuna di esse funziona (né per me né per chiunque nei commenti di quel post).

Ho provato questa condizione di rewrite invece della regola:

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

Così come aggiungere ErrorDocument 401 default alla fine del documento .htaccess.

8
Commenti

Come esattamente non funziona? WordPress mostra la sua pagina di errore 404?

Sally CJ Sally CJ
27 giu 2019 05:49:07

Sì, il reindirizzamento fallisce semplicemente, quindi se la pagina esiste va a /foo, se la pagina non esiste mostra il 404 del tema. Fondamentalmente la regola non impedisce a Wordpress di essere instradato.

Orun Orun
27 giu 2019 16:26:38

In realtà sto anche ricevendo l'errore 404, ma questo dovrebbe essere il risultato previsto nel mio caso poiché il percorso (/foo) non esiste e il rewrite non viene reindirizzato a nessuno script. Prova a disattivare i plugin e/o prova un tema predefinito? Modifica: Voglio dire, sto vedendo la pagina di errore predefinita servita da Apache e non da WordPress.

Sally CJ Sally CJ
27 giu 2019 16:35:56

Ho provato con tutti i plugin disabilitati e il tema twenty-nineteen (il mio tema è comunque personalizzato e non uso molti plugin). Nessun risultato però. Quale regola tra quelle sopra stai usando? RewriteRule ^foo/?$ - [L]? Dove nella sequenza di lettura del .htaccess l'hai inserita?

Orun Orun
27 giu 2019 20:15:22

Sì, la RewriteRule ^foo/?$ - [L] e l'ho inserita nello stesso identico punto come nella domanda - sotto il RewriteEngine On. Ma quel blocco IfModule è l'unico contenuto del mio file .htaccess. Potrebbe essere un problema di caching? Prova a svuotare la cache del browser e del sito, e prova anche con un browser diverso, per vedere se aiuta?

Sally CJ Sally CJ
27 giu 2019 20:42:57

Non dovrebbe essere la cache perché tutto questo dovrebbe essere lato server. Ma ho anche provato una regola casuale e funziona, quindi le regole del .htaccess funzionano all'interno di quel file. Ho provato a rimuovere tutto il resto ma senza successo. Sono solo curioso, quale versione di Apache stai usando? Puoi eseguire apache2 -v o httpd -v?

Orun Orun
27 giu 2019 21:02:38

No, non posso, non su quel server. Ma sto eseguendo Apache/2.4.26 (Red Hat). E su un altro server (httpd -v = Apache/2.4.39 (Unix)), la regola di riscrittura ha funzionato anch'essa.

Sally CJ Sally CJ
28 giu 2019 02:33:07

Grazie per il test, deve esserci qualcosa nella mia configurazione di apache

Orun Orun
28 giu 2019 15:49:59
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 3
0

Dovresti usare RewriteCond invece di RewriteRule. Usa questo:

RewriteCond %{REQUEST_URI} !/foo/

Quindi, ad esempio, il codice completo potrebbe essere così:

# 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 lug 2019 14:01:33
3

Un piccolo intoppo è che dovrai aggiornare RewriteRule ./ in quella penultima riga. Ecco uno snippet aggiornato (e testato) per te:

# 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

Ho testato entrambi:

Spero sia utile!!

2 lug 2019 14:10:13
Commenti

Era questo, grazie. Anche se non sono sicuro del perché . non corrispondesse a ./, avrebbe dovuto corrispondere a entrambi. Per chiunque altro abbia questo problema in futuro: ho ottimizzato leggermente cambiando in ./? e ho scritto un servizio rapido per controllare il file .htaccess e assicurarmi che alcuni plugin o aggiornamenti non lo abbiano sovrascritto/reimpostato.

Orun Orun
2 lug 2019 21:07:28

@Orun non è una buona idea impostare un servizio che impedisce la modifica del file. invece, solo quella parte dovrebbe essere monitorata, perché molti plugin utili scrivono altri blocchi, che non dovrebbero essere disabilitati.

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

Sì, sono d'accordo. Il file è ancora totalmente scrivibile. In realtà avevo già un servizio che scrive il mio blocco in .htaccess all'interno del mio tema, quindi l'ho semplicemente esteso. Cerca solo una riga particolare, la modifica se una condizione è soddisfatta e poi registra la modifica in un log speciale.

Orun Orun
5 lug 2019 17:21:46
2

La seguente regola funziona per me

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

significa che qualsiasi percorso che inizia con foo come /foo/, /foo/bar/ o qualsiasi altro, porta all'errore 404 di Apache invece che al 404 del tema; assumendo che non esista una directory reale con quel percorso.

La regola deve essere prima dell'ultima riga standard del blocco WordPress:

RewriteRule . /index.php [L]

E non importa veramente se è dopo RewriteBase /, può anche essere prima; in precedenza era formulato in modo frettoloso e approssimativo da parte mia.

Questo ti darebbe la possibilità di lasciare il blocco tra # BEGIN WordPress e # END WordPress intatto, se lo desideri. Inserendo

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

prima di # BEGIN WordPress.

Potresti voler evitare che il percorso /foo/ venga creato in WordPress, questo mi è venuto in mente:

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 lug 2019 15:11:38
Commenti

Hai ragione sul fatto che avrei dovuto impostare la mia regola dopo la base, non sono sicuro del perché l'abbia fatto prima in questo post! In realtà nel file .htaccess di produzione era impostato dopo. Grazie comunque per averlo segnalato. È stata una svista da parte mia mentre modificavo il markdown qui.

Orun Orun
5 lug 2019 17:23:45

@Orun Ho chiarito un po' la mia risposta.

Nicolai Grossherr Nicolai Grossherr
5 lug 2019 19:58:45