2011-06-29 5 views
0

Pour l'instant, j'ai un simple .htaccess qui range mes URL de page, en faisant tomber le .php à la fin, ou en l'ajoutant, selon la façon dont vous le regardez.éviter les URL en double avec mon mod_write

Fondamentalement, /about.php deviendra/about. Cependant, cela entraîne l'accès à ma page sur ces deux URL. Je peux juste le sucer et utiliser les balises rel = canonique mais je voudrais aussi le ranger dans mon htaccess.

Existe-t-il un meilleur moyen (règle intelligente) pour 301 le .php à la version none .php, autre que de spécifier manuellement chaque URL?

De plus, ai-je vraiment besoin de ces règles de réécriture?

<IfModule mod_rewrite.c> 


RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ /$1.php [QSA,L] 


ErrorDocument 404 /404 


</IfModule> 

Répondre

0

Pour redirect (301) chaque .php-URL à la version non-.php (dans le cas où il est un fichier existant), vous pouvez utiliser celui-ci:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$ 
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L] 

Les deux premiers RewriteCond en vos .haccess ne sont pas vraiment nécessaires, car vous aurez des conflits de toute façon, par exemple Si vous avez un fichier foo.htm et foo.htm.php, lequel doit être affiché lorsque foo.htm est demandé?

Ainsi, le bloc mod_rewrite complet:

RewriteEngine On 
# redirect /foo.php to /foo 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$ 
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L] 
# rewrite /foo to /foo.php 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ /$1.php [QSA,L] 
+0

Et cela causera 'trop redirection error' –

+0

hein? @ M'vy: tu as raison, mais je ne sais pas pourquoi .. – Floern

+0

Voir ma réponse. J'améliorerai également mon autre article sur la réécriture d'URL. Cela ne fait qu'énoncer implicitement cela. –

0

En vous des règles d'origine, vous êtes en train de dire que toute page qui n'est pas un fichier ou un répertoire doit être redirigé vers le même nom avec .php en annexe.

Donc ce que vous devez faire pour "supprimer" l'accès au fichier .php est de le masquer avec une redirection. Donc, vous direz au navigateur client que foo/foo.php est en fait foo/foo.

Cela va déclencher une nouvelle demande à foo/foo par le client. Ensuite, vous dites au serveur que foo/foo est foo/foo.php. Cela déclenchera une demande interne à foo/foo.php. Donc, ici, vous avez une boucle. Nous devons éviter cela. La meilleure solution de contournement que j'ai trouvée est de vérifier que le %{REDIRECT_URL} est vide ou non.

règles sont enfin:

# External redirection from real file to virtual with safe guard for internal redirection. 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REDIRECT_URL} !^$ 
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L] 

# Internal redirection to real file. 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ /$1.php [QSA,L] 

Ne pas oublier que toute réécriture/redirection déclenche une nouvelle demande!

Voir: How does url rewrite works?

+0

hm .. '% {REDIRECT_URL}' ne fonctionne pas sur mon hôte local .. – Floern

+0

hmmm. Ennuyeux. Travailler pour moi ... Besoin de se cacher moar sur cette question. –

+0

Eh bien, essayez d'ajouter 'E = REDIRECT_URL: $ 1' aux derniers drapeaux RewriteRule? –

Questions connexes