.htaccess reindirizza tutte le pagine al nuovo dominio


218

Quale regola di reindirizzamento dovrei utilizzare per reindirizzare tutte le pagine in olddomain.examplecui reindirizzare newdomain.example?

Il sito ha una struttura totalmente diversa, quindi voglio che tutte le pagine del vecchio dominio vengano reindirizzate alla nuova pagina dell'indice di dominio .

Ho pensato che avrebbe funzionato (nella directory di base olddomain.example):

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

Ma se navigo verso olddomain.example/somepagevengo reindirizzato a newdomain.example/somepage. Mi aspetto un reindirizzamento solo newdomain.examplesenza il suffisso della pagina.

Come tengo fuori l'ultima parte?


8
Per risparmiare tempo, scorri verso il basso fino alla risposta migliore giusta che è RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
Vale la pena sottolineare che, in particolare dal punto di vista SEO, avere un reindirizzamento multiplo all'indice / alla pagina iniziale è generalmente una cattiva idea. È probabile che Google lo veda come un soft-404.
Mr White

Risposte:


201

Potrebbe essere così:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]

Potresti provare a ricaricare il tuo browser? è anche il reindirizzamento con xampp qui. Ho appena provato.
VOI

Mio male ... funziona, il mio servizio di hosting ha avuto qualche altro reindirizzamento su cui sono andate le cose. Grazie! :)
Yuval Adam,

25
Non sarebbe RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts,

1
Dopo un lungo inverno ho modificato il codice in modo che possa finalmente funzionare. (il corretto è reindirizzare se EQUAL e non DIFFERENTE al vecchio dominio, quello era il problema)
carla,

5
@JimGeurts Solo se vuoi reindirizzare TUTTO ciò che non è nuovo dominio. Tuttavia, in questo caso, volevamo reindirizzare SOLO olddomain.
carla,

442

La risposta di seguito potrebbe potenzialmente causare un ciclo di reindirizzamento infinito ...

Qui, questo reindirizza tutto dopo il nome del dominio sull'URL alla stessa copia esatta sul nuovo URL del dominio:

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

www.example.net/somepage.html?var=foo reindirizza a www.newdomain.com/somepage.html?var=foo


21
questo reindirizzamento OGNI richiesta, anche quelli per newdomain.com? E essenzialmente causare due richieste duplicate in quei casi?
Bill Dami,

33
La domanda è reindirizzare tutto alla home page
kravits88

28
Anche se questa non è la risposta alla domanda, ma sono arrivato a questa domanda da SE cercando esattamente questa risposta. Grazie !!!
dav

Come possiamo fare per il reindirizzamento dal sottodominio al nuovo dominio?
Sukhjinder Singh,

2
Qualcuno potrebbe rispondere alla domanda di Bill per favore. Questo non dovrebbe usare un RewriteCond per evitare una richiesta duplicata e / o riscritture non necessarie? Suppongo che non avrebbe alcun impatto evidente riscrivere ogni volta anche se non è necessario. Ma perché farlo.
Andrew

80

Solo per chiarire, dopo aver rimosso il reindirizzamento di hosting che era in mezzo, la mia soluzione originale funziona anche:

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

Questo reindirizzerà all'indice predefinito, che è la domanda. Solo per chiarezza, poiché, a causa della vicinanza, la tua affermazione sembra essere diretta verso la risposta dell'utente 968421 appena sopra questa, la risposta dell'utente 968421 è corretta quando l'intento è di reindirizzare a un nome file corrispondente sul nuovo dominio.
RationalRabbit

19

Ho usato per il mio blog Wordpress questo come .htaccess. Converte http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad ecc., In http: //blah.example/asad Grazie a tutti altre risposte l'ho capito.

<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>

2
Considero questa la risposta più completa di tutte: mantiene il ranking per ogni pagina ed è una catchall per tutti i domini che non sono quelli primari! Cosa potrebbe esserci di meglio?
nzn,

1
La chiave qui è che la regola di riscrittura del dominio precede la regola di riscrittura dell'indice di 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>

Questo ha funzionato per me


Sì, questo metodo sarebbe pulito e carino !, ha funzionato anche per me.
Cody,

questo reindirizzerà con il parametro in URl se presente - index.php? aa = 9 porterà il parametro nel nuovo dominio
Darksymphony

13

Esistono vari modi per eseguire questa operazione e vari reindirizzamenti, li ho elencati di seguito:

301 Reindirizzamento (permanente): punta un intero sito a un diverso URL su base permanente. Questo è il tipo più comune di reindirizzamento ed è utile nella maggior parte delle situazioni. In questo esempio, stiamo reindirizzando al dominio "esempio.com":

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

302 Reindirizzamento (temporaneo): punta un intero sito a un diverso URL temporaneo. Ciò è utile per scopi SEO quando si dispone di una pagina di destinazione temporanea e si prevede di tornare alla pagina di destinazione principale in un secondo momento:

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

Reindirizzare index.html a una sottocartella specifica:

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

Reindirizzare un vecchio file a un nuovo percorso di file:

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

Reindirizzamento a una pagina di indice specifica:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html

Se aggiungi $ 1 al primo esempio, in questo modo Redirect 301 / http://example.com/$1 tutte le pagine del sito originale verranno reindirizzate alla nuova radice del sito
Yassine Mokni,

@YassinMK Non $1è richiesto qui, stai pensando alla RedirectMatchdirettiva (ma allora dovrai comunque definire un gruppo di acquisizione per il $1riferimento).
MrWhite,

Anche se tutte queste Redirectdirettive reindirizzeranno come per simili, mentre l'OP vuole reindirizzare solo alla home page del nuovo sito (anche se questo di per sé non è raccomandato). Potrebbe essere necessario utilizzare la RedirectMatchdirettiva se si desidera reindirizzare a un URL specifico.
MrWhite,

invece di 301 potresti anche scrivere Redirect permanente / h ttps: //www.example.com, puoi farlo nel file vhost
Yvon Huynh,

Ma la domanda riguardava .htaccess, quindi perché menzionare il file vhost?
RustyIngles,

9

Se desideri reindirizzare da una posizione verso un sottodominio puoi utilizzare:

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


È il modo migliore. Perché molti Webhoster non consentivano l'uso di RewriteEngine in .htaccess. Funziona alla grande comunque!
Sprinterfreak il

È necessario utilizzare RewriteEngine per reindirizzare. Il motivo per cui hai avuto problemi è che RewriteEngine era già attivo e dovevi solo reindirizzare la regola. Sono contento che abbia aiutato.
VuotoSd

Non vero. Salta tutto ciò che riscrive e quando si usa RewriteEngine Ongenera 500 Internal Error. È uno spazio Web molto limitato. L'utilizzo Redirect 301 / http://fooè l'unico modo possibile per affrontare.
Sprinterfreak,

6

Se il nuovo dominio a cui stai reindirizzando il tuo vecchio sito si trova su un host diverso, puoi semplicemente utilizzare a Redirect

Redirect 301 / http://newdomain.com

Questo reindirizzerà tutte le richieste da olddomaina newdomain.

Redirectdirettiva non funzionerà o potrebbe causare un Redirect looperrore se il tuo nuovo dominio e vecchio dominio sono entrambi sullo stesso host, in tal caso dovrai utilizzare il mod-rewritereindirizzamento in base all'intestazione host richiesta.

RewriteEngine on


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

5

La mia reputazione non mi consente di commentare una risposta, ma volevo solo sottolineare che la risposta più votata qui ha un errore:

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

dovrebbe avere una barra prima di $ 1, quindi

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

3

La mia soluzione come SymLinks non funzionava sul mio server, quindi ho usato un If nel mio 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();
}

2

Questo è un bug nelle versioni precedenti di apache (e quindi mod_rewrite) in cui il prefisso del percorso è stato aggiunto al percorso riscritto se è stato modificato. Vedere qui

Penso che sia stato corretto in apache2 V2.2.12, c'è un flag speciale che devi usare che aggiungerò qui quando lo trovo, (penso che fosse NP per No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]

Ho sbattuto la testa contro questo per quasi un mese
interrogativo

2

Dal punto di vista dell'usabilità sarebbe meglio, se invii anche il percorso con la richiesta (cioè, quello che hai al momento) e consenti al tuo nuovo sito di gestirlo:

Hai cercato "/ prodotti".

Purtroppo questa pagina non c'è più. Desideri visitare invece "/ new_products"?

(e meglio, ancora, farlo automaticamente.)

Questo è ovviamente un sacco di codifica ed euristica per un sito Web più grande, ma secondo me pagherebbe in termini di soddisfazione dell'utente (quando il segnalibro del prodotto dei tuoi sogni accuratamente salvato ti porta solo alla prima pagina di newdomain.com, questo è frustrante.)


Per detto sito Web questo è praticamente irrilevante in quanto l'intero sito Web è cambiato, ma hai assolutamente ragione. Il sito Web dovrebbe essere il più retrocompatibile possibile. +1
Yuval Adam,

2

Se desideri che il reindirizzamento completi un nuovo sito (dominio) diverso senza parametri o pagine, utilizza questo:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]

1
Questo non funzionerà come previsto se usato in .htaccessquanto semplicemente non corrisponderà a nessun URL nella radice del documento. Funzionerebbe in una configurazione server o in un contesto VirtualHost.
Mr White

2

Ho provato la risposta di user968421 e la soluzione dell'OP, ma il browser ha visualizzato un errore di sicurezza per una pagina di pagamento. Non so dirti perché esattamente.

Anche il nostro host (Site Ground) non è riuscito a capirlo.

La soluzione finale era vicina, ma una leggera modifica alla risposta di user968421 (nota a margine: a differenza dell'OP, stavo cercando di reindirizzare alla pagina corrispondente, non solo alla homepage, quindi ho mantenuto il riferimento posteriore [il $1dopo il dominio] dai user968421 risposta):

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

Hai ottenuto il tweak da questo generatore di reindirizzamento htaccess raccomandato da un articolo di Host Gator (tempi disperati, misure disperate, prima?).


2

Semplice come questo e questo non porterà la query finale dall'URL al nuovo dominio.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]

che in realtà ha funzionato per me, ho bisogno di una soluzione senza passare alcuna lumaca al nuovo dominio Grazie Dsynmphony
Faisal Mehmood Awan

1

Utilizzare reindirizzamenti condizionali con Options -FollowSymLinkse AllowOverride -Optionsdisabilitati dall'Hoster se devono essere offerti anche alcuni file locali:

Esempio di .htaccess

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

Questo esempio servirà index.html locale e reindirizza tutto il resto del personale al nuovo dominio.


1

Prova questo metodo per reindirizzare tutto al nuovo dominio della home page, Funziona per me:

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

0

Le risposte precedenti non hanno funzionato per me.

Ho usato questo codice. Se stai usando OSX assicurati di usare il formato corretto.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.