2010-11-29 5 views
9

j'utilisais quelque chose comme ça ...Quelle est la différence entre RewriteRule et rediriger 301

RewriteRule here/(.*) http://www.there.com/$1 [R=301,L] 

mais n'a pas pu le faire fonctionner

Alors je ... ce

redirect 301 /here http://www.there.com 

et cela a bien fonctionné.

Quelqu'un peut-il expliquer la différence? Avez-vous besoin des deux?

Aussi ... comment exclure les chemins de la redirection?

... Comme redirect 301 tous ...

redirect 301 /here http://www.there.com 

mais

/here/stayhere.html 

Merci

+0

Êtes-vous sûr que cela n'a rien à voir avec regex? – Keng

+0

Oui ... idealmachine ci-dessous dit qu'il utilise regex. N'est-ce pas comme ça que tout est égalé? – gravityboy

+0

Et Gumbo dit qu'il utilise "expression régulière" – gravityboy

Répondre

13

RewriteRule is handled by Apache's mod_rewrite, tandis que Redirect is handled by mod_alias. Non, vous n'avez pas besoin des deux. Votre RewriteRule (qui utilise regex) ne correspondra pas /here (mais correspondra à des chemins comme /here/foo.html) car il recherche une barre oblique immédiatement après. Vous pouvez rendre cela facultatif en utilisant un point d'interrogation:

RewriteRule ^here(/?.*) http://www.there.com$1 [R=301,L] 

Maintenant, cela aura le même effet que votre redirection. RewriteCond peut être ajouté pour exclure certains chemins:

RewriteCond $0 !/here/stayhere\.html 

Notez que certains serveurs n'ont pas activé mod_rewrite par défaut. Si vous ajoutez RewriteEngine on à votre configuration ne résout pas le problème et vous ne pouvez pas passer mod_rewrite sur, au moins mod_alias fournit la directive RedirectMatch, qui peut être assez bon:

RedirectMatch 301 ^/here(?!/stayhere\.html)(/?.*) http://www.there.com$1 
+2

substitue indirectement la correspondance avec la cible, laissant les autres parties intactes. RewriteRule va réellement à la cible entièrement avec rien reporté de la partie recherchée. Grande différence. – ahnbizcad

1

Le RewriteRule probablement ne fonctionne pas parce que vous dites un peu différent chose que vous étiez dans la redirection. Le RewriteRule nécessite l'adresse d'inclure le mot "ici", suivi d'une barre oblique. La redirection nécessite que l'adresse d'avoir le mot "ici" précédé par une barre oblique. Je voudrais aller avec quelque chose comme ceci:

RewriteRule ^here/?(.*) http://www.there.com/$1 [R=301,L] 

Le ajouté ? fait la barre oblique en option, et le ^ au début fait en sorte que le « ici » doit être au début de l'adresse, non n'importe où à l'intérieur.

Quant à l'exclusion d'une adresse particulière, vous voulez le faire en précédant le RewriteRule avec cette ligne:

RewriteCond %{REQUEST_URI} !(here/stayhere\.html) 

qui lui indique d'ignorer la règle s'ils demandent cette adresse spécifique.

4

Redirect correspond aux préfixes de chemin. Les Redirect matchs après tout chemin qui est le préfixe (segment de chemin sage) est /here et l'ajoute à la nouvelle URI:

Redirect 301 /here http://example.com 

Ainsi, toute demande que son chemin commence par /here seront redirigés vers http://example.com Wile annexant tous les suffixes chemin suivants de /here à http://example.com. Contrairement à cela, RewriteRule fonctionne avec des expressions régulières. Dans ce cas, les éléments suivants RewriteRule correspond à tout chemin qui contient here/:

RewriteRule here/(.*) http://example.com/$1 [R=301,L] 

Tout après here/ sera alors ajouté à la nouvelle URL.

Alors que les deux directives auraient le même effet lors de la demande d'URL avec des chemins commençant par /here, ce dernier correspondra également à toute requête dont le chemin contient uniquement here/ comme /not/here/foo.

De plus, vous ne pouvez utiliser des conditions supplémentaires avec mod_rewrite:

RewriteCond $0 !=here/stayhere.html 
RewriteRule ^here(/.*)?$ http://example.com$0 [L,R=301] 

Si vous voulez faire la même chose avec mod_alias, vous devrez utiliser RedirectMatch avec une expression régulière qui correspondre à quelque chose, mais /here/stayhere.html.