2010-11-29 33 views
9

ich so etwas wie dieses ...Was ist der Unterschied zwischen RewriteRule ist und umleiten 301

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

aber konnte es nicht

So habe ich diese ...

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

und es hat gut funktioniert.

Kann jemand den Unterschied erklären? Brauchen Sie beides?

Auch ... wie schließe ich Pfade von der Umleitung aus?

Wie ... 301 alle umleiten ...

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

aber

/here/stayhere.html 

Dank

+0

Sind Sie sicher, dass das etwas mit Regex zu tun hat? – Keng

+0

Ja ... idealmachine unten sagte, es verwendet Regex. Ist das nicht alles so abgestimmt? – gravityboy

+0

Und Gumbo sagt, es verwendet "regulären Ausdruck" – gravityboy

Antwort

13

RewriteRule is handled by Apache's mod_rewrite, während Redirect is handled by mod_alias. Nein, du brauchst beides nicht.

Ihre RewriteRule (die regex verwendet) stimmt nicht mit /here überein (passt aber auf solche Pfade wie /here/foo.html), weil sie unmittelbar danach nach einem Schrägstrich sucht. Sie können das optional machen, indem Sie ein Fragezeichen verwenden:

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

Jetzt wird das den gleichen Effekt wie Ihr Redirect haben. RewriteCond kann hinzugefügt werden, um bestimmte Pfade auszuschließen:

RewriteCond $0 !/here/stayhere\.html 

Beachten Sie, dass bei einigen Servern mod_rewrite standardmäßig nicht aktiviert ist. Wenn das Hinzufügen RewriteEngine on Ihre Konfiguration nicht das Problem beheben, und Sie können nicht mod_rewrite einschalten, mindestens mod_alias bietet die RedirectMatch Richtlinie, die gut genug sein kann:

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

Redirect ersetzt die Übereinstimmung mit dem Ziel, so dass die anderen Teile intakt. RewriteRule geht tatsächlich vollständig zum Ziel, wobei nichts von dem gesuchten Teil übernommen wird. Großer Unterschied. – ahnbizcad

1

Die RewriteRule wahrscheinlich nicht arbeiten, weil Sie sagen, eine etwas andere Ding als du in der Umleitung waren. Die RewriteRule erfordert, dass die Adresse das Wort "hier" enthält, gefolgt von einem Schrägstrich. Die Umleitung erfordert, dass die Adresse das Wort "here" über einen Schrägstrich vorangestellt hat. Ich würde mit so etwas wie diesem geht:

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

Die zusätzlichen ? der Schrägstrich optional macht, und die ^ am Anfang macht es so, dass die „hier“ an dem Start der Adresse sein muss, nicht irgendwo drinnen.

wie für eine bestimmte Adresse auszuschließen, würden Sie das tun, indem Sie die RewriteRule mit dieser Zeile vor:

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

, dass es die Regel zu ignorieren sagt, wenn sie für diese Adresse sind gefragt speziell.

4

Redirect passt Pfadpräfixe. Die folgende Redirect entspricht einem beliebigen Pfad, der Präfix (Pfadsegment weise) ist, ist /here und hängt es an den neuen URI:

Redirect 301 /here http://example.com 

So wird jede Anforderung, Pfad ist beginnt mit /here wird http://example.com wile weitergeleitet Anfügen alle folgenden Pfad Suffixe /here bis http://example.com.

Im Gegensatz dazu funktioniert RewriteRule mit regulären Ausdrücken. In diesem Fall wird die folgende RewriteRule jeden Pfad übereinstimmen, die here/ enthält:

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

Alles, was danach here/ wird dann auf die neue URL angehängt werden.

Während beide Direktiven beim Anfordern von URLs mit Pfaden, die mit /here beginnen, den gleichen Effekt haben, wird auch letzterer jede Anforderung abgleichen, deren Pfad here/ wie /not/here/foo enthält.

Des Weiteren Sie zusätzliche Bedingungen mit mod_rewrite verwenden können:

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

Wenn Sie das gleiche mit mod_alias tun wollen, müssen Sie RedirectMatch mit einem regulären Ausdruck verwenden, die alles andere als /here/stayhere.html übereinstimmen.

Verwandte Themen