2009-09-14 9 views
41

Après la refonte d'un site, j'ai quelques pages à rediriger. Tout reste sur le même domaine, juste quelques éléments ont été réorganisés et/ou renommés. Ils sont de la forme:.htaccess 301 redirection d'une seule page

/contact.php

est maintenant:

/contact-us.php

Utilisation du fichier .htaccess, j'ai ajouté cette ligne, ce qui est celui que je trouve le plus recommandé:

RedirectMatch 301 /contact.php /contact-us.php 

Cela est surtout bien - il fait le travail - le problème est, il redirige également:

  • /team1/contact.php
  • /non-existant-folder/contact.php

Y at-il un moyen de spécifier que je veux seulement rediriger la racine contact.php dans la?

+0

Dan ura don ... Je pense, mais il y a longtemps demandé depuis longtemps .... je peux – OpenWebWar

Répondre

68

RedirectMatch utilise une expression régulière correspondant au chemin de l'URL. Et votre expression régulière /contact.php signifie simplement tout chemin d'URL qui contient /contact.php mais pas seulement un chemin d'URL qui est exactement /contact.php. Il faut donc utiliser les points d'ancrage pour le début et la fin de la chaîne (^ et $).

RedirectMatch 301 ^/contact\.php$ /contact-us.php 
+0

Merci, fonctionne comme un charme. – Dan

+0

Lorsque je fais cela avec quelque chose comme www.domain.com/contact.php?location=12 il redirige vers www.domain.com/home/mike/public_html/contact-us.php?location=12 mais seulement quand il y a le arguments là-bas. – Mike

+1

Je l'ai corrigé en mettant l'URL complète (avec http: //) du côté de la destination ainsi: "RedirectMatch 301 ^/contact \ .php $ http://www.domain.com/contact-us.php". – Mike

18

Cela devrait le faire

RedirectPermanent /contact.php /contact-us.php 
+0

Ne vois pas pourquoi cela devrait résoudre le problème. 'RedirectPermanent ...' est identique à 'Redirect 301 ...'. – Gumbo

+0

Gumbo, RedirectPermanent prend (URL-Path) comme paramètre et RedirectMatch prend (URL Regex), Par conséquent, lorsque vous utilisez RedirectMatch sans (^) pour marquer un début de ligne, cela ne fonctionne pas. Utiliser RedirectPermanent est aussi beaucoup plus rapide que les alternatives regex. – duckyflip

+0

@duckyflip: Ah désolé, vous avez raison. Interprétez mal 'RedirectMatch' avec juste' Redirect'. Mais 'Redirect' ne fait que vérifier un préfixe. – Gumbo

0

Vous pouvez également utiliser un RewriteRule si vous voulez la capacité à le modèle Match et les URL de redirection.

+0

Pourquoi cela a-t-il été rejeté? – Ryall

0

Si vous préférez utiliser le simplest possible solution à un problème, une alternative à RedirectMatch est, plus basique, directive Redirect

Il n'utilise pas correspondance de motif et est donc plus explicite et plus facile pour les autres à comprendre.

-à-dire

<IfModule mod_alias.c> 

#Repoint old contact page to new contact page: 
Redirect 301 /contact.php http://example.com/contact-us.php 

</IfModule> 

Les chaînes de requête doivent être reportées parce que les docs disent:

informations de chemin supplémentaires au-delà du chemin URL assortie sera ajouté à l'URL cible.

5
redirect 301 /contact.php /contact-us.php 

Il n'y a pas de point en utilisant la règle de RedirectMatch et d'avoir à écrire vos liens de sorte qu'ils sont correspondance exacte. Si vous n'incluez pas, vous n'avez pas à exclure!Il suffit d'utiliser rediriger sans correspondance, puis utiliser les liens normalement

+0

Simple, c'est mieux. Si vous n'avez pas besoin d'un pattern (regex) alors ce serait la syntaxe la plus efficace. – jeffkee

-1

Il redirigera votre page de magasin à votre page de contact

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/
    Redirect 301 http://www.youtdomain.com/store http://www.youtdomain.com/contact 
    </IfModule> 
Questions connexes