.htaccess przekierowuje wszystkie strony do nowej domeny

218

Jakiej reguły przekierowania użyłbym do przekierowania wszystkich stron, olddomain.exampledo których nastąpi przekierowanie newdomain.example?

Witryna ma zupełnie inną strukturę, dlatego chcę, aby każda strona w starej domenie była przekierowywana na nową stronę indeksu domen .

Myślałem, że tak się stanie (w katalogu podstawowym olddomain.example):

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

Ale jeśli przejdę do, nastąpi olddomain.example/somepageprzekierowanie do newdomain.example/somepage. Spodziewam się przekierowania tylko do newdomain.examplesufiksu strony.

Jak ukryć ostatnią część?

Yuval Adam
źródło
8
Aby zaoszczędzić czas, przewiń w dół do właściwej najlepszej odpowiedzi, którą jest RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack,
2
Warto zauważyć, że szczególnie z punktu widzenia SEO przekierowanie wielu osób do strony głównej / indeksu jest ogólnie złym pomysłem. Google prawdopodobnie uzna to za soft-404.
MrWhite

Odpowiedzi:

201

Może być tak:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]
TY
źródło
Um, możesz spróbować ponownie załadować przeglądarkę? przekierowuje tu nawet xampp. Właśnie przetestowałem.
TY
Mój zły ... to działa, moja usługa hostingowa miała jakieś inne przekierowanie, na którym było cholernie rzeczy. Dzięki! :)
Yuval Adam,
25
Nie byłoby RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts
1
Po długiej zimie zredagowałem kod, aby w końcu mógł działać. (poprawne jest przekierowanie, jeśli RÓWNE, a nie RÓŻNE do olddomain, to był problem)
carla
5
@JimGeurts Tylko jeśli chcesz przekierować WSZYSTKO, co nie jest nową domeną. Jednak w tym przypadku chcieliśmy przekierować TYLKO olddomain.
carla
442

Poniższa odpowiedź może potencjalnie spowodować nieskończoną pętlę przekierowania ...

Tutaj przekierowuje wszystko po nazwie domeny w adresie URL do dokładnie tej samej kopii w nowym adresie domeny:

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

www.example.net/somepage.html?var=foo przekierowuje do www.newdomain.com/somepage.html?var=foo

Chris Stryczyński
źródło
21
nie przekieruje KAŻDEJ prośby, nawet te dla newdomain.com? I zasadniczo powodują dwa duplikaty wniosków w tych przypadkach?
Bill Dami,
33
Pytanie polega na przekierowaniu wszystkiego na stronę główną
kravits88
28
Chociaż to nie jest odpowiedź na pytanie, ale przyszedłem na to pytanie od SE, szukając dokładnie tej odpowiedzi. dzięki !!!
David
Jak możemy zrobić przekierowanie z subdomeny do nowej domeny?
Sukhjinder Singh,
2
Czy ktoś mógłby odpowiedzieć na pytanie Billa? Czy nie powinno to wykorzystywać RewriteCond, aby zapobiec duplikowaniu żądań i / lub niepotrzebnemu ponownemu zapisywaniu? Przypuszczam, że ponowne pisanie za każdym razem nie będzie miało zauważalnego wpływu, nawet jeśli nie jest to konieczne. Ale po co to robić.
Andrew
80

Żeby wyjaśnić, po usunięciu przekierowania hostingowego, które było przeszkodą, moje oryginalne rozwiązanie działa również:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]
Yuval Adam
źródło
Spowoduje to przekierowanie do domyślnego indeksu, o który chodziło w pytaniu. Dla jasności, ponieważ ze względu na bliskość, twoje oświadczenie wydaje się być skierowane w kierunku odpowiedzi user968421 tuż powyżej, odpowiedź user968421 jest poprawna, gdy celem jest przekierowanie do odpowiedniej nazwy pliku w nowej domenie.
RationalRabbit
19

Użyłem tego na moim blogu Wordpress jako .htaccess. Konwertuje http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad itp., Na http: //blah.example/asad Dzięki wszystkim inne odpowiedzi wymyśliłem to.

<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
źródło
2
Uważam to za najbardziej kompleksową odpowiedź ze wszystkich: zachowuje ranking dla każdej strony i jest catchall dla wszystkich domen, które nie są najważniejsze! Co mogło być lepiej?
nzn
1
Kluczem tutaj jest to, że reguła przepisywania domen występuje przed regułą przepisywania indeksu WordPress.
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>

To zadziałało dla mnie

Iana Sergiejeva
źródło
Tak, ta metoda byłaby czysta i przyjemna!
Cody,
przekieruje to z parametrem w URl, jeśli jakiś - index.php? aa = 9 przeniesie parametr do nowej domeny
Darksymphony
13

Istnieją różne sposoby, aby to zrobić i różne przekierowania, wymieniłem je poniżej:

301 (Stałe) Przekierowanie: Wskaż całą witrynę na inny adres URL na stałe. Jest to najczęstszy typ przekierowania i jest przydatny w większości sytuacji. W tym przykładzie przekierowujemy do domeny „przyklad.com”:

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

Przekierowanie 302 (tymczasowe): skieruj całą witrynę na inny tymczasowy adres URL. Jest to przydatne do celów SEO, jeśli masz tymczasową stronę docelową i planujesz wrócić do głównej strony docelowej w późniejszym terminie:

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

Przekieruj index.html do określonego podfolderu:

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

Przekieruj stary plik do nowej ścieżki pliku:

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

Przekieruj do określonej strony indeksu:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html
RustyIngles
źródło
Jeśli dodasz 1 USD do pierwszego przykładu, w ten sposób, Redirect 301 / http://example.com/$1 wszystkie strony oryginalnej witryny zostaną przekierowane do nowego katalogu głównego witryny
Yassine Mokni
@YassinMK Nie $1jest tu wymagane, myślisz o RedirectMatchdyrektywie (ale wtedy nadal musisz zdefiniować grupę przechwytującą, aby się $1do niej odwoływać).
MrWhite
Chociaż wszystkie te Redirectdyrektywy będą przekierowywać jak dla podobnych, podczas gdy OP chce przekierować tylko na stronę główną nowej witryny (chociaż samo w sobie nie jest to zalecane). Może być konieczne użycie RedirectMatchdyrektywy, jeśli chcesz po prostu przekierować do określonego adresu URL.
MrWhite
zamiast 301 możesz również napisać Przekierowanie permanent / h ttps: //www.example.com, możesz to zrobić w pliku vhost
Yvon Huynh
Ale pytanie dotyczyło .htaccess, więc po co wspominać o pliku vhost?
RustyIngles
9

Jeśli chcesz przekierować z jakiejś lokalizacji do subdomeny, możesz użyć:

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

EmptySD
źródło
To najlepszy sposób. Ponieważ wielu Webhosterów nie pozwoliło na użycie RewriteEngine w .htaccess. To i tak działa świetnie!
Sprinterfreak,
Aby przekierować, musisz użyć RewriteEngine. Powodem, dla którego miałeś problem, jest to, że RewriteEngine był już aktywny i potrzebujesz tylko reguły przekierowania. Cieszę się, że to pomogło.
EmptySD
Nie prawda. Pomija wszystkie rzeczy Rewrite, a przy użyciu RewriteEngine Onrzuca 500 Błąd wewnętrzny. To bardzo ograniczona przestrzeń internetowa. Korzystanie Redirect 301 / http://foojest jedynym możliwym sposobem radzenia sobie.
Sprinterfreak
6

Jeśli nowa domena, do której przekierowujesz starą witrynę, znajduje się na innym hoście, możesz po prostu użyć Redirect

Redirect 301 / http://newdomain.com

Spowoduje to przekierowanie wszystkich żądań z olddomaindo newdomain.

Redirectdyrektywa nie będzie działać lub może spowodować a, Redirect loopjeśli zarówno twoja nowa domena, jak i stara domena są na tym samym hoście, w takim przypadku będziesz musiał użyć mod-rewriteprzekierowania na podstawie żądanego nagłówka hosta.

RewriteEngine on


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

Moja reputacja nie pozwala mi skomentować odpowiedzi, ale chciałem tylko zauważyć, że tutaj najwyżej oceniana odpowiedź zawiera błąd:

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

powinien mieć ukośnik przed 1 $, więc

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]
John Brandenburg
źródło
3

Moje rozwiązanie jako SymLinks nie działało na moim serwerze, więc użyłem If w PHP.

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
źródło
2

Jest to błąd występujący w starszych wersjach apache (a więc mod_rewrite), w których prefiks ścieżki był dołączany do przepisanej ścieżki, jeśli została zmieniona. Spójrz tutaj

Myślę, że zostało to naprawione w apache2 V2.2.12, jest specjalna flaga, której musisz użyć, którą dodam tutaj, kiedy ją znajdę (myślę, że była to NP dla No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]
Znak zapytania
źródło
Uderzyłem się w głowę przez prawie miesiąc
znak zapytania
2

Z punktu widzenia użyteczności byłoby lepiej, gdybyś wysłał również ścieżkę z żądaniem (tj. To, co masz w tej chwili) i pozwolisz, aby Twoja nowa strona sobie z tym poradziła:

Szukałeś „/ products”.

Niestety tej strony nie ma. Czy zamiast tego chcesz odwiedzić „/ new_products”?

(i jeszcze lepiej, robi to automatycznie).

Jest to oczywiście dużo kodowania i heurystyki dla większej witryny, ale moim zdaniem opłaci się to pod względem satysfakcji użytkownika (gdy starannie zapisana zakładka wymarzonego produktu prowadzi tylko do pierwszej strony newdomain.com, to jest frustrujące).

Boldewyn
źródło
W przypadku wspomnianej witryny nie ma to większego znaczenia, ponieważ zmieniła się cała witryna, ale masz całkowitą rację. Strona internetowa powinna być jak najbardziej kompatybilna wstecz. +1
Yuval Adam
2

Jeśli chcesz, aby przekierowanie zakończyło nową inną witrynę (domenę) bez parametrów lub stron, użyj tego:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]
MCurbelo
źródło
1
To nie będzie działać zgodnie z oczekiwaniami, gdy zostanie użyte, .htaccessponieważ po prostu nie będzie pasowało do żadnych adresów URL w katalogu głównym dokumentu. Działa w konfiguracji serwera lub w kontekście VirtualHost.
MrWhite
2

Próbowałem odpowiedzi użytkownika969621 i rozwiązania PO, ale przeglądarka wyświetliła błąd bezpieczeństwa dla strony kasy. Nie mogę ci powiedzieć dlaczego.

Nasz host (Site Ground) również nie mógł tego rozgryźć.

Ostateczne rozwiązanie było bliskie, ale drobna korekta odpowiedzi użytkownika968421 (uwaga: w przeciwieństwie do OP próbowałem przekierować na odpowiednią stronę, nie tylko na stronę główną, więc zachowałem referencję $1wsteczną [ za domeną] użytkownika969621 odpowiedź):

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

Dostałem poprawkę z tego generatora przekierowań htaccess zalecanego przez artykuł Host Gator (desperackie czasy, desperackie środki, amiright?).

J May
źródło
2

Tak proste, a to nie przeniesie końcowego zapytania z adresu URL do nowej domeny.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]
Darksymphony
źródło
które faktycznie działało dla mnie, potrzebuję rozwiązania bez przekazywania ślimaka do nowej domeny Dzięki Dsynmphony
Faisal Mehmood Awan
1

Użyj przekierowań warunkowych z Options -FollowSymLinksi AllowOverride -Optionswyłączonych przez Hoster, jeśli chcesz również podać kilka plików lokalnych:

Próbka .htaccess

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

Ten przykład będzie obsługiwać lokalny index.html i przekierowywać wszystkich innych pracowników do nowej domeny.

Sprinterfreak
źródło
1

Wypróbuj tę metodę, aby przekierować wszystko na stronę główną nowej domeny. Działa to dla mnie:

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

Poprzednie odpowiedzi nie działały dla mnie.

Użyłem tego kodu. Jeśli używasz OSX, upewnij się, że używasz prawidłowego formatu.

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