2010-01-05 12 views
5

Quando si digita questo "http://example.com/Hello%20There/", viene visualizzata la pagina indice che è: "http://example.com/Hello%20There/index.html".Problema trailing slash

Bene, quello che voglio fare è quando l'utente digita "http://example.com/Hello%20There" (così come il primo tranne che non ha una barra finale).

Ho provato molte cose e espressioni particolarmente regolari, ma niente funziona perché penso che il server interrompe il processo di registrazione quando trova uno spazio ("% 20" nell'URL).

Ho provato questo reg exp:

Options +FollowSymLinks 
rewriteEngine On rewriteCond %{REQUEST_URI} ^(.*)\ (.*html)$ 
rewriteRule ^.*$ %1-%2 [E=space_replacer:%1-%2] 
rewriteCond %{ENV:space_replacer}!^$ 
rewriteCond %{ENV:space_replacer}!^.*\ .*$ 
rewriteRule ^.*$ %{ENV:space_replacer} [R=301,L] 

e anche mettere:

DirectorySlash On 

nel modulo "mod_dir" di Apache.

Quindi, la mia domanda è: - Come dire al server per aggiungere una barra finale quando l'utente digita un URL senza una barra finale; $

risposta

13

Si può fare un carattere facoltativo aggiungendo il ? quantificatore ad esso in questo modo:

RewriteRule ^([^/]+)/?$ $1/index.html 

Ora sia /foobar e /foobar/ sarebbe stato riscritto per /foobar/index.html.

Ma sarebbe meglio se si utilizza una sola ortografia, con o senza la barra finale, e reindirizzare l'altro:

# remove trailing slash 
RewriteRule (.+)/$ /$1 [L,R=301] 

# add trailing slash 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .*[^/]$ /$1/ [L,R=301] 

Queste regole rimuovere o aggiungere una barra finale mancante e fare un permanente reindirizzare.

+0

Ti sei perso parentesi in regola secondo riscrittura. –

+0

Per favore, qual è l'ultima combinazione di regole da utilizzare? Sono davvero interessato a questa domanda, e non riesco a farlo funzionare bene ... Grazie –

1

Ho avuto lo stesso problema, ma stavo usando mod_alias per configurare un sito secondario. Risulta, ho bisogno di fare un secondo alias senza la barra finale in modo che funzionasse correttamente. Sembrava qualcosa di simile:

Alias /forum/ "/var/www/forum" 
Alias /forum "/var/www/forum" 

<Directory "/var/www/forum"> 
    Options FollowSymlinks 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
</Directory> 

In Ubuntu, ho dovuto modificare il file /etc/apache2/mods-enabled/alias.conf con queste righe, quindi riavviare apache. Non ho trovato questa risposta ovunque sul web; Mi sono imbattuto in esso da solo mentre mod_rewrite non funzionava e neanche il comando DirectorySlash è stato di aiuto. Mi è stato l'aggiunta di un programma non-Drupal come un sito secondario sotto un installazione di Drupal, che è quello che ha dato il via tutta questa follia, in primo luogo ...