2010-06-08 5 views
0

Je vais avoir un petit problème avec mod_rewritequestion Redirect utilisant mod_rewrite (pas d'extension - racine d'un site)

Je le suivre dans mes .htaccess:

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^(.+)\.htm$ index.php?name=$1 [NC] 

Ceci est mon index.php fichier:

<?php echo $_GET['name']; ?> 

Cela fonctionne très bien pour l'adresse suivante:

www.mySite.com/this est un exemple.htm

cela affichera « ceci est un exemple »

Ce que je suis en train de faire est cependant l'obtenir pour faire la même chose, sans l'extension .htm: par exemple:

www.mySite.com/this est un exemple

Toutes les idées?

(ne pense pas qu'il est pertinent, mais j'utilise xampp pour tester cette)

+0

-1? se soucier de commenter? – Alex

+0

Soit vous avez introduit un type dans votre code index.php, soit vous manquez une citation après 'name' dans' $ _GET ['nom] '... –

+0

Alex

Répondre

1

Vous pouvez juste faire l'extension facultative dans la règle de réécriture:

RewriteEngine on 
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC] 

Notez que c'est à peu près l'équivalent Ce qui signifie que toute URL autre que le fait d'aller directement sur www.mySite.com sera redirigée vers index.php. Si vous avez des règles plus spécifiques, elles devraient apparaître avant celle-ci.

Mise à jour: Comme je le disais, cette règle correspondra essentiellement à toutes les URL sur www.mySite.com - y compris index.php! Par conséquent, quand vous allez à www.mySite.com/this is an example, ce qui suit se produit:

  1. ^(.+)(\.htm)?$ correspond à « ceci est un exemple »
  2. mod_rewrite traduit que pour /index.php?name=this est un exemple
  3. mod_rewrite redirige vers /index.php?name=c'est un exemple
  4. Après la redirection, mod_rewrite essaie à nouveau d'évaluer les règles.
  5. ^(.+)(\.htm)?$ correspond à "index.php"
  6. mod_rewrite traduit cela en /index.php?name=index.php, la valeur précédente démolir le nom paramètre querystring

Afin d'éviter la seconde redirection (en spécifiant [L], ou le dernier, ne fonctionne pas, car après les premières règles de redirection sont réappliquées), vous pouvez utiliser un RewriteCond pour indiquer quand redirect:

RewriteCond %{REQUEST_URI} !^index\.php 
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC] 

Cela dit mod_rewrite à pas appliquer la règle si la demande URI (la partie de l'URL après le domaine) commence par index.php.

Vous devriez jeter un oeil aux autres conditions de réécriture que vous pouvez spécifier. Par exemple, vous ne voulez probablement pas que les utilisateurs soient redirigés s'ils broutent directement à un autre fichier php, que ce soit, vous pouvez spécifier que dans votre RewriteCond aussi:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^index\.php 
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC] 

qui se lit « si la demande est pas fichier et la requête n'est pas index.php, rediriger vers index.php ".

+0

merci pour votre réponse rapide. quand j'essaye ceci cependant, la sortie sur ma page est "index.php" au lieu de "ceci est un exemple" – Alex

+0

Ajoutez [L] à la règle. – Wrikken

+0

n'a toujours pas fonctionné - ce genre de fait RewriteRule^([^/\.] +) /? $ Index.php? Name = $ 1 [L] - cependant, si je mets "www.whatever.com/this est un test.htm "ça explose ...? – Alex