.htaccess leitet alle Seiten auf eine neue Domain um

218

Mit welcher Umleitungsregel würde ich alle Seiten olddomain.exampleumleiten, unter die umgeleitet werden soll newdomain.example?

Die Site hat eine völlig andere Struktur, daher möchte ich, dass jede Seite unter der alten Domain auf die neue Domain- Indexseite umgeleitet wird .

Ich dachte, das würde reichen (unter dem Basisverzeichnis olddomain.example):

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.example/ [R=301]

Wenn ich jedoch zu navigiere, werde olddomain.example/somepageich zu weitergeleitet newdomain.example/somepage. Ich erwarte eine Weiterleitung nur nach newdomain.exampleohne das Seitensuffix.

Wie halte ich den letzten Teil draußen?

Yuval Adam
quelle
8
Um Zeit zu sparen, scrollen Sie nach unten zur besten Antwort, die RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack
2
Insbesondere aus SEO-Sicht ist es im Allgemeinen eine schlechte Idee, eine Eins-zu-Eins-Weiterleitung zum Index / zur Startseite durchzuführen. Google wird es wahrscheinlich als Soft-404 sehen.
MrWhite

Antworten:

201

Kann so sein:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]
SIE
quelle
Könnten Sie versuchen, Ihren Browser neu zu laden? Es wird hier sogar mit xampp umgeleitet. Ich habe gerade getestet.
SIE
Mein schlechtes ... es funktioniert, mein Hosting-Service hatte eine andere Weiterleitung, bei der es um alles ging. Vielen Dank! :)
Yuval Adam
25
Wäre es nicht so RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts
1
Nach einem langen Winter habe ich den Code bearbeitet, damit er endlich funktioniert. (Das Richtige ist, umzuleiten, wenn GLEICH und nicht UNTERSCHIEDLICH zur alten Domäne, das! war das Problem)
Carla
5
@ JimGeurts Nur wenn Sie ALLES umleiten möchten, was keine neue Domäne ist. In diesem Fall wollten wir jedoch NUR die alte Domäne umleiten.
Carla
442

Die folgende Antwort könnte möglicherweise eine Endlosumleitungsschleife verursachen ...

Hier leitet dieser alles nach dem Domainnamen in der URL auf genau dieselbe Kopie in der neuen Domain-URL um:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

www.example.net/somepage.html?var=foo leitet weiter zu www.newdomain.com/somepage.html?var=foo

Chris Stryczynski
quelle
21
Wird dies nicht JEDE Anfrage umleiten, auch nicht die für newdomain.com? Und im Wesentlichen zwei doppelte Anfragen in diesen Fällen verursachen?
Bill Dami
33
Die Frage ist, alles auf die Homepage umzuleiten
kravits88
28
Dies ist zwar nicht die Antwort auf die Frage, aber ich bin zu dieser Frage von SE gekommen, um genau diese Antwort zu suchen. Vielen Dank !!!
Dav
Wie können wir von der Subdomain zur neuen Domain umleiten?
Sukhjinder Singh
2
Könnte jemand bitte Bills Frage beantworten. Sollte dies nicht eine RewriteCond verwenden, um eine doppelte Anforderung und / oder unnötige Umschreibungen zu verhindern? Ich nehme an, es hätte keine spürbaren Auswirkungen, jedes Mal neu zu schreiben, obwohl es nicht notwendig ist. Aber warum?
Andrew
80

Nur um zu verdeutlichen, dass meine ursprüngliche Lösung nach dem Entfernen der im Weg befindlichen Hosting-Weiterleitung auch funktioniert:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]
Yuval Adam
quelle
Dadurch wird zum Standardindex umgeleitet, um den es in Ihrer Frage ging. Aus Gründen der Klarheit scheint Ihre Aussage aufgrund der Nähe auf die Antwort von Benutzer968421 gerichtet zu sein. Die Antwort von Benutzer968421 ist korrekt, wenn beabsichtigt wird, auf einen entsprechenden Dateinamen in der neuen Domäne umzuleiten.
RationalRabbit
19

Ich habe dies für mein Wordpress-Blog als .htaccess verwendet. Es konvertiert http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad usw. in http: //blah.example/asad Vielen Dank an alle andere Antworten Ich habe das herausgefunden.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^YOURDOMAIN\.example$ [NC]
RewriteRule ^(.*)$ https://YOURDOMAIN.example/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Daantje
quelle
2
Ich halte dies für die umfassendste Antwort von allen: Es behält das Ranking für jede Seite bei und ist ein Sammelbegriff für alle Domains, die nicht die primäre sind! Was wäre besser?
nzn
1
Der Schlüssel hier ist, dass die Domain-Rewrite-Regel vor der WordPress-Index-Rewrite-Regel steht.
MrMoxy
14
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^olddomain.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.olddomain.com$
  RewriteRule (.*)$ http://www.newdomain.com/$1 [R=301,L]
</IfModule>

Das hat bei mir funktioniert

Iana Sergieieva
quelle
Ja, diese Methode wäre sauber und schön!, Hat auch bei mir funktioniert.
Cody
Dies wird mit dem Parameter in URl umleiten, falls vorhanden - index.php? aa = 9 wird den Parameter in die neue Domäne übertragen
Darksymphony
13

Es gibt verschiedene Möglichkeiten, dies zu tun, und verschiedene Weiterleitungen. Ich habe sie unten aufgeführt:

301 (Permanent) Weiterleitung: Zeigen Sie eine gesamte Site permanent auf eine andere URL. Dies ist die häufigste Art der Umleitung und in den meisten Situationen nützlich. In diesem Beispiel leiten wir zur Domain "example.com" um:

# This allows you to redirect your entire website to any other domain
Redirect 301 / http://example.com/

302 (Temporäre) Weiterleitung: Zeigen Sie eine gesamte Site auf eine andere temporäre URL. Dies ist nützlich für SEO-Zwecke, wenn Sie eine temporäre Zielseite haben und zu einem späteren Zeitpunkt wieder zu Ihrer Hauptzielseite wechseln möchten:

# This allows you to redirect your entire website to any other domain
Redirect 302 / http://example.com/

Leiten Sie index.html in einen bestimmten Unterordner um:

# This allows you to redirect index.html to a specific subfolder
Redirect /index.html http://example.com/newdirectory/

Leiten Sie eine alte Datei in einen neuen Dateipfad um:

# Redirect old file path to new file path
Redirect /olddirectory/oldfile.html http://example.com/newdirectory/newfile.html

Auf eine bestimmte Indexseite umleiten:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html
RustyIngles
quelle
Wenn Sie dem ersten Beispiel $ 1 hinzufügen, werden Redirect 301 / http://example.com/$1 alle Seiten der ursprünglichen Site zum Stamm der neuen Site umgeleitet
Yassine Mokni
@YassinMK Das $1ist hier nicht erforderlich, Sie denken an die RedirectMatchDirektive (aber dann müssten Sie noch eine Erfassungsgruppe definieren, auf die $1verwiesen werden soll).
MrWhite
Obwohl alle diese RedirectAnweisungen Gleiches für Gleiches umleiten, möchte das OP nur auf die Homepage der neuen Site umleiten (obwohl dies an sich nicht zu empfehlen ist). Möglicherweise müssen Sie die RedirectMatchDirektive verwenden, wenn Sie nur zu einer bestimmten URL umleiten möchten.
MrWhite
Anstelle von 301 können Sie auch Redirect permanent / h ttps: //www.example.com schreiben. Sie können dies in der vhost-Datei tun
Yvon Huynh
Aber die Frage bezog sich auf .htaccess. Warum also die vhost-Datei erwähnen?
RustyIngles
9

Wenn Sie von einem Ort zur Subdomain umleiten möchten, können Sie Folgendes verwenden:

Redirect 301 /Old-Location/ http://subdomain.yourdomain.com

EmptySD
quelle
Es ist der beste Weg. Weil viele Webhoster die Verwendung von RewriteEngine in .htaccess nicht zugelassen haben. Das funktioniert sowieso super!
Sprinterfreak
Sie müssen RewriteEngine verwenden, um umzuleiten. Der Grund, warum Sie ein Problem hatten, ist, dass RewriteEngine bereits aktiv war und Sie nur eine Umleitungsregel benötigten. Ich bin froh, dass das geholfen hat.
EmptySD
Nicht wahr. Es überspringt alle Rewrite-Dinge und RewriteEngine Onwirft bei Verwendung 500 interne Fehler. Es ist ein sehr eingeschränkter Webspace. Verwenden Redirect 301 / http://fooist der einzig mögliche Weg, um damit umzugehen.
Sprinterfreak
6

Wenn sich die neue Domain, zu der Sie Ihre alte Site umleiten, auf einem anderen Host befindet, können Sie einfach eine verwenden Redirect

Redirect 301 / http://newdomain.com

Dadurch werden alle Anforderungen von olddomainan umgeleitet newdomain.

Redirect Richtlinie wird nicht funktionieren oder kann a verursachen Redirect loop dass sich sowohl Ihre neue als auch Ihre alte Domäne auf demselben Host befinden. In diesem Fall müssen Sie mod-rewritedie Umleitung basierend auf dem angeforderten Host-Header verwenden.

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 
starkeen
quelle
5

Mein Ruf erlaubt mir nicht, eine Antwort zu kommentieren, aber ich wollte nur darauf hinweisen, dass die am höchsten bewertete Antwort hier einen Fehler enthält:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com$1 [R=301,L]

sollte einen Schrägstrich vor dem $ 1 haben, also

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]
John Brandenburg
quelle
3

Meine Lösung als SymLinks funktionierte auf meinem Server nicht, daher habe ich in meinem PHP ein If verwendet.

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
$redirect = str_replace("www.", "", curPageURL());
$remove_http_root    = str_replace('http://', '', $redirect);
$split_url_array     = explode('/', $remove_http_root );


if($split_url_array[0] == "olddomain.com"){
    header("Location: http://www.newdomain.com/$split_url_array[1]");
    die();
}
Brent
quelle
2

Dies ist ein Fehler in älteren Versionen von Apache (und damit mod_rewrite), bei dem das Pfadpräfix an den neu geschriebenen Pfad angehängt wurde, wenn es geändert wurde. Siehe hier

Ich denke, es wurde in Apache2 V2.2.12 behoben. Es gibt ein spezielles Flag, das Sie verwenden müssen und das ich hier hinzufügen werde, wenn ich es finde. (Ich denke, es war NP für No Path.)

RewriteRule ^(.*)$ http://newdomain.com/ [??]
Fragezeichen
quelle
Ich habe fast einen Monat lang meinen Kopf dagegen geschlagen
Fragezeichen
2

Unter dem Gesichtspunkt der Benutzerfreundlichkeit wäre es besser, wenn Sie auch den Pfad mit der Anfrage senden (dh was Sie gerade haben) und Ihre neue Site damit umgehen lassen:

Sie haben nach "/ products" gesucht.

Leider ist diese Seite weg. Möchten Sie stattdessen "/ new_products" besuchen?

(und noch besser, dies automatisch zu tun.)

Dies ist natürlich eine Menge Codierung und Heuristik für eine größere Website, aber meiner Meinung nach würde sich dies in Bezug auf die Benutzerzufriedenheit auszahlen (wenn Ihr sorgfältig gespeichertes Lesezeichen Ihres Traumprodukts Sie nur zur Startseite von newdomain.com führt, dies ist frustrierend.)

Boldewyn
quelle
Für diese Website ist dies ziemlich irrelevant, da sich die gesamte Website geändert hat, aber Sie sind absolut korrekt. Die Website sollte so abwärtskompatibel wie möglich sein. +1
Yuval Adam
2

Wenn Sie möchten, dass die Umleitung eine neue, unterschiedliche Site (Domain) ohne Parameter oder Seiten vervollständigt, verwenden Sie Folgendes:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]
MCurbelo
quelle
1
Dies funktioniert nicht wie erwartet, wenn es verwendet wird, .htaccessda es einfach nicht mit URLs im Dokumentstamm übereinstimmt. Es würde in einer Serverkonfiguration oder einem VirtualHost-Kontext funktionieren.
MrWhite
2

Ich habe die Antwort von user968421 und die Lösung des OP ausprobiert, aber der Browser hat einen Sicherheitsfehler für eine Checkout-Seite angezeigt. Ich kann dir nicht genau sagen warum.

Unser Gastgeber (Site Ground) konnte es auch nicht herausfinden.

Die endgültige Lösung war knapp, aber eine kleine Änderung an der Antwort von user968421 (Randnotiz: Im Gegensatz zum OP habe ich versucht, auf die entsprechende Seite umzuleiten, nicht nur auf die Homepage, sodass ich den Rückverweis [ $1nach der Domain] von user968421 beibehalten habe Antworten):

RewriteEngine on
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]

Haben Sie die Optimierung von diesem htaccess-Umleitungsgenerator erhalten , der von einem Host Gator-Artikel empfohlen wird (verzweifelte Zeiten, verzweifelte Maßnahmen, nicht wahr?).

J Mai
quelle
2

Einfach so und dies überträgt die nachfolgende Abfrage nicht von der URL zur neuen Domain.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]
Darksymphonie
quelle
Das hat tatsächlich für mich funktioniert. Ich brauche eine Lösung, ohne dass eine Schnecke an eine neue Domain übergeben wird. Danke Dsynmphony
Faisal Mehmood Awan
1

Verwenden Sie bedingte Weiterleitungen mit dem Hoster Options -FollowSymLinksund AllowOverride -Optionsdeaktivieren Sie ihn, wenn auch einige lokale Dateien bereitgestellt werden sollen:

Beispiel .htaccess

# Redirect everything except index.html to http://foo
<FilesMatch "(?<!index\.html)$">
    Redirect 301 / http://foo/
</FilesMatch>

In diesem Beispiel wird die lokale Datei index.html bereitgestellt und alle anderen Mitarbeiter werden auf eine neue Domäne umgeleitet.

Sprinterfreak
quelle
1

Versuchen Sie diese Methode, um alle auf die neue Domain der Homepage umzuleiten. Es funktioniert für mich:

RewriteCond %{HTTP_HOST} ^olddomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.olddomain\.com$
RewriteRule ^(.*)$ "https\:\/\/newdomain\.com\/" [R=301,L]
Hans Ganteng
quelle
0

Die vorherigen Antworten haben bei mir nicht funktioniert.

Ich habe diesen Code verwendet. Wenn Sie OSX verwenden, stellen Sie sicher, dass Sie das richtige Format verwenden.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Alfrex92
quelle