.htaccess Riscrivi per forzare la barra finale alla fine

Ho il seguente codice nel mio file htaccess:

# Force Trailing Slash RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301] 

Sembra che funzioni bene quando vado su www.mydomain.com/test che lo reindirizza a / test /. Il problema è quando vado su www.mydomain.com/test/another che non inserisce la barra finale su un’altra.

Qualcuno sa come modificare il mio codice per far funzionare la barra finale, indipendentemente dalla lunghezza dell’URL?

Grazie!

 RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

Modifica : nel caso in cui desideri escludere alcune richieste come per i file php:

 RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif)$ RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

Una risposta leggermente più solida, basata sulla risposta sopra :

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)([^/])$ /$1$2/ [L,R=301] 

Il RewriteCond controllerà per assicurarsi che non ci siano file con quel nome, e in caso contrario, esegui RewriteRule. Più a prova di futuro di avere una lista di estensioni manuale!

Mentre la soluzione della Morte funziona, può essere fastidiosa quando ti dimentichi di aggiungere determinati tipi di file alla lista. Puoi farlo per forzare la barra finale per tutti gli URL che non puntano direttamente a un file usando !-f nella condizione.

 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*[^/])$ http://%{HTTP_HOST}/$1/ [L,R=301] 

La risposta accettata non ha funzionato per me. Questo ha fatto, da SEOMoz :

 # Ensure all URLs have a trailing slash. RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301] 

Nota il RewriteBase / per ogni regola. Almeno, quando l’ho rimosso, ha smesso di funzionare.

 RewriteRule ^(.*)[^/]$ $1/ [L,R=301] 

Questo dovrebbe funzionare abbastanza bene. Controlla solo che il carattere finale non sia una barra e ne aggiunge uno.

Questo funziona perfettamente per me. (dal commento dell’utente Ajax)
Il problema con altri link è stato il mio CSS ha smesso di funzionare dopo aver applicato la regola di reindirizzamento, ma anche i CSS stanno funzionando bene con la regola di riscrittura sottostante

 RewriteRule ^((.*)[^/])$ $1/ [L,R=301] 

Codice completo

  RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ #Force Trailing slash RewriteRule ^((.*)[^/])$ $1/ [L,R=301]  

Questo funziona perfettamente per me e non si basa sulla valutazione di un file reale, poiché alcuni hanno suggerito il flag “-f”:

 RewriteCond %{REQUEST_URI} !\.[a-z0-9]+$ [NC] RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301] 

Sopra gli esempi non ha funzionato per me grazie alla barra forzata alla fine della regola, ad esempio $ 1 $ 2 /.

Per me ha funzionato questo (l’ho usato per wordpress e reindirizzamento a HTTPS). Devi aggiungere la condizione e le linee di regole appena dietro le linee RewriteEngine e RewriteBase:

 # BEGIN WordPress  RewriteEngine On RewriteBase / # I added these two lines for redirect to HTTPS RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  # END WordPress` 

Per forzare la barra finale, puoi usare:

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteRule [^/]$ %{REQUEST_URI}/ [L,R] 

Nota il modulo mod-dir che viene eseguito prima della mod-rewrite automatica aggiunge automaticamente una barra finale quando vede una richiesta per una directory existant dir , quindi dobbiamo escludere le directory dalla regola altrimenti utilizzando la regola senza RewriteCond %{REQUEST_FILENAME} !-d su alcuni server, finirai in /dir// oppure potrebbero causare problemi se hai distriggersto il DirectorySlash.

La regola sopra aggiunge una barra finale a tutte le richieste, inclusi i file con estensione, se non vuoi i tuoi file con una barra finale, puoi escluderli aggiungendo la seguente condizione sopra la Regola

 RewriteCond %{REQUEST_FILENAME} !-f 
   

aggiungi questa regola nel tuo file di configurazione e funziona per me