2009-08-17 9 views
0

Voici un problème récurrent. Il y a des questions similaires sur SO à ce sujet, mais rien ne répond tout à fait à ma question.Réécrire les URL pour exclure les extensions de fichier

J'ai un site Web et je veux que chaque page soit disponible à une seule URL. Cela devrait fonctionner dynamiquement sur toutes les pages, pas sur un nom de fichier codé en dur.

  1. domain.tld/foo devrait rediriger vers domain.tld/foo/
  2. domain.tld/foo.php devrait rediriger vers domain.tld/foo/
  3. domain.tld/foo/ doit donner à l'utilisateur (mais pas le rediriger vers) domain.tld/foo.php

1 et 3 ne sont pas trop dur, mais Je ne peux pas comprendre 2 sans introduire une référence circulaire et échouer avec trop de redirections. Comment serais-je capable de faire ça?

Répondre

2

Essayez ces trois règles:

RewriteCond %{THE_REQUEST} ^GET\s/[^?\s]+\.php[?\s] 
RewriteRule (.+)\.php$ /$1/ [L,R=301] 
RewriteCond $0 !.+\.php$ 
RewriteRule (.*[^/])$ /$1/ [L,R=301] 
RewriteRule (.+)/$ $1.php [L] 

et d'exclure tout autre fichier existant, mettez cette règle devant les autres:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule !.+\.php$ - [L] 
+1

Merci, mais cela réécrit toutes les URL de 'foo.php /'. Ils pointent tous vers le même endroit, ce qui est bien, mais je veux me débarrasser de '.php'. Je bricole toujours avec ça. – avdgaag

+0

@avdgaag: Correction d'un problème. – Gumbo

+0

@Gumbo: génial, cela a fonctionné. Merci beaucoup! – avdgaag

1

Réécriture # 1 est pris en charge par

DirectorySlash on 

qui devrait être la valeur par défaut de toute façon.

Pour # 2 et # 3:

RewriteRule /(.+).php /$1/ [R=301,L] 
RewriteRule /(.+)/ /$1.php 
+0

Le 'DirectorySlash' est agréable, merci pour cela. Le reste me donne des redirections infinies pour 'foo/bar /' et 'foo/bar.php', alors que' foo/bar' conduit 'foo'. – avdgaag

+0

Hm, j'ai pensé à partir de la question que vous vouliez cela pour les URL mono-composant. –

0

Si ma bonne compréhension, votre problème est semblable à ce que je devais faire face quand je posté une question ici How can I detect if page was requested via a redirect?

Bien que nous ne pouvions pas trouver une réponse entièrement résoudre le problème, encore certaines des réponses là peuvent vous être utiles.

Questions connexes