2011-10-15 3 views
5

J'ai un peu de mal à trouver quelque chose qui devrait être simple. Je veux 301 rediriger tout dans un répertoire vers un seul fichier dans un nouvel emplacement.Rediriger 301 à partir d'un répertoire vers un fichier unique

Dans mon .htaccess, je l'ai déjà essayé ce qui suit ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html 

et ce ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/ 

et ce ...

Redirect 301 /myDir http://www.mydomain.com/myNewDir 

Le problème est que chacun d'entre eux sont simplement la cartographie de chaque fichier /myDir/ et en l'ajoutant à la fin de l'URL de destination.

Après googler, j'ai vu quelque chose qui a dit de le faire ...

Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir 

Mais cela ne fonctionne tout simplement la même chose ... il est cartographie l'emplacement du fichier existant à la fin de l'URL. Il était facile de trouver beaucoup de ".htaccess rediriger" tutoriels en ligne, mais ils semblent ne montrer que les exemples évidents comme «mappage de fichier one-to-one» ou «mappage de répertoire one-to-one». Ces tutoriels semblent également négliger d'expliquer les différentes directives de fichiers pertinentes et comment les utiliser correctement.

Ce compte d'hébergement particulier est garbage et a également des extensions FrontPage installées. Mod-rewrite échoue (casse tout le site) mais les lignes Redirect 301 fonctionnent bien. Donc, jusqu'à ce que je puisse déplacer ce nouveau site (non-FrontPage) vers un compte d'hébergement plus robuste, je vais devoir m'en tenir au Redirect 301 one-liner.


Comment puis-je utiliser simplement un Redirect 301 pour rediriger tout dans les /myDir/ à la même seul fichier situé à /myNewDir/index.html? (Je préférerais utiliser seulement /myNewDir/ si possible). Veuillez expliquer en détail les directives de fichier utilisées dans votre solution.


MISE À JOUR:

réponse précédemment acceptée ne fonctionne pas.

Exemple:

RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html 

... donne un "Trop de redirections ont eu lieu en essayant d'ouvrir" erreur.

C'est parce que /myDir1/(.*) des mises en correspondance tout lieu dans la chaîne si l'URL cible contient /myDir1/ nulle part, non seulement la racine, il va être redirigé dans une boucle méchant.

Voir ma propre réponse pour la bonne solution.

Répondre

12

J'ai trouvé la réponse dans l'un de mes anciens projets.

Redirect 301 est tout faux pour cela. Je voulais vraiment RedirectMatch 301 à la place.

RedirectMatch 301 ^/myDir/(.*) http://www.mydomain.com/myNewDir/ 

Explication (s):

http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

"Cette directive est équivalente à Rediriger, mais utilise des standards expressions régulières, au lieu de simples préfixe correspondant."

http://www.zytrax.com/tech/web/regex.htm

« Le^(circonflexe ou caret) à l'extérieur entre crochets signifie regarder que le début de la chaîne cible, par exemple,^Win ne trouvera pas Windows dans STRING1 mais^Moz trouvera Mozilla. "

et ...

« La. (Période) désigne tout caractère (s) dans cette position, par exemple, tonnes. Trouverez des tonnes, le ton et sans motif, mais pas tonneau car il n'a pas de caractère suivant . "

et ...

Le * (astérisque ou étoile) correspond au caractère précédent 0 ou plus fois, par exemple, Tré trouveront arbre (2 fois) et la bande de roulement (1 fois) et creux (0 fois). *

+0

Merci beaucoup. Cela commençait à me rendre fou. Cela fonctionne pour diriger le contenu d'un répertoire entier (chaque page à l'intérieur) vers une page donnée. – Tom

+0

Si vous avez déjà eu une redirection 301 au mauvais endroit (en ajoutant la page à l'URL de destination), vous devrez peut-être vider le cache de votre navigateur avant de récupérer la nouvelle règle depuis .htaccess. – Russ

1

Essayez ceci:

RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.html 

Référence: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch.

En ce qui concerne les supports autour. * Sont concernés, RedirectMatch utilise des expressions régulières standards, ce qui signifie que vous pouvez capturer caractères correspondants et les utiliser dans votre règle de redirect les refferencing $ 1, $ 2, etc.

En régulier expressions * signifie n'importe quel nombre de répétitions du caractère précédent. . - dénote tout caractère. Donc la combinaison. * Dit que ce motif correspond à n'importe quel nombre de caractères. Par conséquent * . * signifie que ce modèle correspondra à/myDir et/myDir /, et toujours /myDir/test.html. Alors * . * peut également être utilisé

+0

Oui, cela fonctionne. Je sais que '. *' Correspond à tous les fichiers. Mais pouvez-vous développer cela? Des variations? Pourquoi '(. *)' Fonctionne-t-il également? Un lien vers la documentation en ligne à ce sujet? Je vous remercie! – Sparky

+0

Voir: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch A propos des parenthèses.* RedirectMatch utilise des expressions régulières standard, ce qui signifie que vous pouvez capturer les caractères correspondants et les utiliser dans votre règle de redirection les renvoyant à $ 1, $ 2, etc. – dfsq

+0

Dans les expressions régulières * signifie n'importe quel nombre de répétitions du caractère précédent. '.' - désigne n'importe quel characher. Donc la combinaison. * Dit que ce motif correspond à n'importe quel nombre de caractères. Par conséquent * . * signifie que ce modèle correspondra à/myDir et/myDir /, et toujours /myDir/test.html. Alors * . * peut également être utilisé. – dfsq

Questions connexes