web-dev-qa-db-fra.com

Vous utilisez un .htaccess pour RewriteRule et Redirect 301 en même temps?

J'ai quelques URL spécifiques que je veux afficher différemment sur mon site Web, comme ceci:

RewriteRule ^contact$ contact.php

Pour obtenir l'extension ".php".

Et pour être convivial avec le référencement (pour éviter que 2 URL différentes pointant vers la même page), je souhaite également effectuer une redirection 301 entre l'ancienne URL et la nouvelle:

Redirect 301 /contact.php http://www.example.com/contact  

Chacune des lignes ci-dessus fonctionne bien séparément. Mais si je les ajoute tous les deux dans mon htaccess, j'ai une boucle de redirection et rien ne s'affiche sur mon site Web. Comment puis-je résoudre ce problème?

En fin de compte, si je tape "/ contact" ou "/contact.php", je souhaite voir la page de contact avec l’url "/ contact".

1
pimpampoum

Je devais posez moi-même cette question . C'est étonnamment difficile à faire. Olaf Dietsche a fourni la solution consistant à utiliser une variable d'environnement:

RewriteRule ^contact$ contact.php [L,E=CLEAN_CONTACT_URL:1]
RewriteCond %{ENV:REDIRECT_CLEAN_CONTACT_URL} !1
RewriteRule ^contact\.php$ /contact [R=301,L]

Ainsi, la redirection ne sera exécutée que lorsque contact.php sera l'URL réelle et non l'URL réécrite.

Je l'ai testé avec mon propre serveur pour vérifier que cela fonctionne:

$ curl -s --head http://example.com/contact.php
HTTP/1.1 301 Moved Permanently
Date: Sun, 27 Jul 2014 16:28:01 GMT
Server: Apache
Location: http://example.com/contact
Content-Type: text/html; charset=iso-8859-1

$ curl -s --head http://example.com/contact
HTTP/1.1 200 OK
Date: Sun, 27 Jul 2014 16:28:01 GMT
Server: Apache
Content-Type: text/html; charset=UTF-8

La raison pour laquelle vous définissez la variable d’environnement CLEAN_CONTACT_URL, puis que vous la lisiez ainsi: REDIRECT_CLEAN_CONTACT_URL est expliquée ici .

1
Stephen Ostermiller

Oui vous le feriez Vous dites à Apache de prendre n'importe quelle référence de contact et de réécrire l'URI dans contact.php, puis de dire à Apache de prendre toute référence de contact.php et de la remplacer par/contact qui sera capturé à nouveau par la première règle.

Voici ce qui vous manque. Apache apporte les modifications pour chaque réécriture ou redirection, puis relance tout le processus de correspondance. Ainsi, après votre RewriteRule, Apache convertit la demande en contact.php et après votre redirection, Apache reconvertit presque la demande en son contenu initial.

Si vous utilisez le nom de fichier contact.php à des fins de référencement, je supprimerais ce concept. Les noms de fichiers aident autant que le nom de répertoire (apparent). De plus, les noms de fichier contenant un seul mot-clé ne semblent pas avoir beaucoup d’importance, surtout quand il s’agit d’un mot aussi courant. Il y a des exceptions, bien sur. Les noms de marques avec des noms de produits semblent avoir de l'importance. Dans ce cas, il suffit de faire les choses à l'ancienne - un lien approprié et aucune substance de fantaisie.

Votre redirection est correcte. Je l’utiliserais, cependant, je n’utiliserais pas de fichiers spécifiquement nommés PHP tels que contact.php. Cela confond simplement les choses. Au lieu de cela, je resterais avec index.php qui devrait être votre DirectoryIndex. À moins que vous n'ayez plusieurs fichiers dans votre répertoire/contact, cela devrait fonctionner correctement. Si vous faites cela, vous pouvez supprimer votre RewriteRule et tout devrait bien fonctionner.

Clair comme de la boue?

1
closetnoc

Utilisez le drapeau [L] sur votre règle de réécriture et placez votre redirection devant elle. (Je vais utiliser une réécriture ici aussi)

RewriteRule ^/contact\.php$ http://www.example.com/contact [R=301,L]
RewriteRule ^contact$ /contact.php [L]

Lorsque la première règle est rencontrée, elle correspond à la demande /contact.php et constitue la dernière règle traitée. La redirection vers/contact ne correspond pas à la première règle, mais correspond à la seconde qui est servie de manière transparente à partir de /contact.php

Je n'ai pas testé cela mais cela devrait fonctionne.

0
Dave Lozier

Vous mélangez les modules mod_alias et mod_rewrite, ce qui signifie que le résultat final est souvent inattendu.

Vous ne devez utiliser mod_rewrite que dans votre cas, c’est-à-dire, repoace votre

Redirect 301 /contact.php http://www.example.com/contact

avec

RewriteRule contact.php http://www.example.com/contact [R=301,L]

Et puis, comme Dave l'a mentionné, vous devez utiliser l'indicateur [L] pour arrêter le traitement de RewriteRule.

0
Tero Kilkanen