.htaccess redirige toutes les pages vers un nouveau domaine


218

Quelle règle de redirection utiliserais-je pour rediriger toutes les pages vers lesquelles olddomain.exampleêtre redirigé newdomain.example?

Le site a une structure totalement différente, donc je veux que chaque page de l'ancien domaine soit redirigée vers la nouvelle page d'index du domaine .

Je pensais que cela ferait (sous le répertoire de base olddomain.example):

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

Mais si je navigue vers, olddomain.example/somepageje suis redirigé vers newdomain.example/somepage. Je m'attends à une redirection uniquement newdomain.examplesans le suffixe de page.

Comment garder la dernière partie à l'extérieur?


8
Pour gagner du temps, faites défiler vers le bas jusqu'à la meilleure réponse qui est RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
Il convient de souligner que, en particulier du point de vue du référencement, avoir une redirection plusieurs-à-un vers l'index / la page d'accueil est généralement une mauvaise idée. Google est susceptible de le voir comme un soft-404.
MrWhite

Réponses:


201

Peut être comme ça:

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

Pourriez-vous essayer de recharger votre navigateur? sa même redirection avec xampp ici. Je viens de tester.
VOUS

Mon mauvais ... ça fonctionne, mon service d'hébergement avait une autre redirection sur laquelle était fu **** les choses. Merci! :)
Yuval Adam

25
N'est-ce pas RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts

1
Après un long hiver, j'ai édité le code pour qu'il puisse enfin fonctionner. (le correct est de rediriger si ÉGAL et non DIFFÉRENT vers olddomain, c'était le problème)
carla

5
@JimGeurts Uniquement si vous souhaitez rediriger TOUT ce qui n'est pas un nouveau domaine. Cependant, dans ce cas, nous voulions rediriger SEULEMENT l'ancien domaine.
carla

442

La réponse ci-dessous pourrait potentiellement provoquer une boucle de redirection infinie ...

Ici, celui-ci redirige tout après le nom de domaine sur l'URL vers la même copie exacte sur la nouvelle URL de domaine:

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

www.example.net/somepage.html?var=foo redirige vers www.newdomain.com/somepage.html?var=foo


21
cela ne redirigera-t-il pas CHAQUE demande, même pour newdomain.com? Et provoquer essentiellement deux demandes en double dans ces cas?
Bill Dami

33
La question est de tout rediriger vers la page d'accueil
kravits88

28
Bien que ce ne soit pas la réponse à la question, mais je suis venu à cette question de SE en cherchant exactement cette réponse. Merci !!!
dav

Comment pouvons-nous faire pour rediriger du sous-domaine vers le nouveau domaine?
Sukhjinder Singh

2
Quelqu'un pourrait-il répondre à la question de Bill, s'il vous plaît. Cela ne devrait-il pas utiliser un RewriteCond pour empêcher une demande en double et / ou des réécritures inutiles? Je suppose que cela n'aurait pas d'impact notable à réécrire à chaque fois même si ce n'est pas nécessaire. Mais pourquoi faire ça.
Andrew

80

Juste pour clarifier, après avoir supprimé la redirection d'hébergement qui était sur le chemin, ma solution d'origine fonctionne également:

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

Cela redirigera vers l'index par défaut, ce qui était votre question. Juste pour plus de clarté, car, en raison de la proximité, votre déclaration semble être dirigée vers la réponse de user968421 juste au-dessus de cela, la réponse de user968421 est correcte lorsque l'intention est de rediriger vers un nom de fichier correspondant sur le nouveau domaine.
RationalRabbit

19

J'ai utilisé pour mon blog Wordpress cela comme .htaccess. Il convertit http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad etc., en http: //blah.example/asad Merci à tous d'autres réponses, j'ai compris cela.

<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
Je considère que c'est la réponse la plus complète de toutes: elle préserve le classement pour chaque page et est un fourre-tout pour tous les domaines qui ne sont pas les principaux! Qu'est-ce qui pourrait être mieux?
nzn

1
La clé ici est que la règle de réécriture de domaine précède la règle de réécriture d'index 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>

Cela a fonctionné pour moi


Oui, cette méthode serait propre et agréable!, A également fonctionné pour moi.
Cody

cela redirigera avec le paramètre dans URl le cas échéant - index.php? aa = 9 portera le paramètre vers un nouveau domaine
Darksymphony

13

Il existe différentes façons de procéder et diverses redirections, je les ai répertoriées ci-dessous:

Redirection 301 (permanente): pointez un site entier vers une URL différente de façon permanente. Il s'agit du type de redirection le plus courant et il est utile dans la plupart des situations. Dans cet exemple, nous redirigeons vers le domaine "example.com":

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

302 Redirection (temporaire): pointez un site entier vers une URL temporaire différente. Cela est utile à des fins de référencement lorsque vous avez une page de destination temporaire et que vous prévoyez de revenir à votre page de destination principale à une date ultérieure:

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

Redirigez index.html vers un sous-dossier spécifique:

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

Redirigez un ancien fichier vers un nouveau chemin de fichier:

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

Rediriger vers une page d'index spécifique:

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

Si vous ajoutez 1 $ au premier exemple, comme ceci, Redirect 301 / http://example.com/$1 alors toutes les pages du site d'origine seront redirigées vers la nouvelle racine du site
Yassine Mokni

@YassinMK Le $1n'est pas requis ici, vous pensez à la RedirectMatchdirective (mais alors vous devrez quand même définir un groupe de capture pour le $1référencer).
MrWhite

Bien que toutes ces Redirectdirectives redirigent de la même manière, alors que l'OP souhaite rediriger uniquement vers la page d'accueil du nouveau site (bien que cela ne soit pas recommandé en soi). Vous devrez peut-être utiliser la RedirectMatchdirective si vous souhaitez simplement rediriger vers une URL spécifique.
MrWhite

au lieu de 301, vous pouvez également écrire Redirection permanente / h ttps: //www.example.com, vous pouvez le faire dans le fichier vhost
Yvon Huynh

Mais la question concernait le .htaccess alors pourquoi mentionner le fichier vhost?
RustyIngles

9

Si vous souhaitez rediriger depuis un emplacement vers un sous-domaine, vous pouvez utiliser:

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


C'est la meilleure façon. Parce que de nombreux hébergeurs n'ont pas autorisé l'utilisation de RewriteEngine dans .htaccess. Cela fonctionne très bien quand même!
Sprinterfreak

Vous devez utiliser RewriteEngine pour rediriger. La raison pour laquelle vous avez rencontré un problème est que RewriteEngine était déjà actif et que vous n'aviez besoin que d'une règle de redirection. Je suis content que cela ait aidé.
EmptySD

Pas vrai. Il saute toute chose de réécriture et lors de l'utilisation RewriteEngine Onlance 500 erreurs internes. C'est un espace Web très restreint. L'utilisation Redirect 301 / http://fooest le seul moyen possible de gérer.
Sprinterfreak

6

Si le nouveau domaine vers lequel vous redirigez votre ancien site se trouve sur un hôte différent, vous pouvez simplement utiliser un Redirect

Redirect 301 / http://newdomain.com

Cela redirigera toutes les demandes de olddomainvers newdomain.

RedirectLa directive ne fonctionnera pas ou peut provoquer un Redirect loopsi votre nouveau domaine et votre ancien domaine sont tous deux sur le même hôte, dans ce cas, vous devrez utiliser mod-rewritepour rediriger en fonction de l'en-tête d'hôte demandé.

RewriteEngine on


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

5

Ma réputation ne me permet pas de commenter une réponse, mais je voulais juste souligner que la réponse la mieux notée ici contient une erreur:

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

devrait avoir une barre oblique avant le 1 $, donc

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

3

Ma solution comme SymLinks ne fonctionnait pas sur mon serveur, j'ai donc utilisé un If dans mon 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

Il s'agit d'un bogue dans les anciennes versions d'apache (et donc de mod_rewrite) où le préfixe du chemin était ajouté au chemin réécrit s'il était changé. Vois ici

Je pense que cela a été corrigé dans apache2 V2.2.12, il y a un drapeau spécial que vous devez utiliser que j'ajouterai ici quand je le trouverai (je pense que c'était NP pour No Path)

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

Je me suis cogné la tête contre cela pendant près d'un mois
Question Mark

2

Du point de vue de l'utilisabilité, il serait préférable que vous envoyiez également le chemin avec la demande (c'est-à-dire ce que vous avez en ce moment) et que votre nouveau site s'en occupe:

Vous avez recherché "/ products".

Malheureusement, cette page a disparu. Souhaitez-vous plutôt visiter "/ nouveaux_produits"?

(et mieux encore, le faire automatiquement.)

C'est évidemment beaucoup de codage et d'heuristique pour un site Web plus grand, mais à mon avis, cela serait payant en termes de satisfaction des utilisateurs (lorsque votre signet soigneusement enregistré de votre produit de rêve vous conduit simplement à la première page de newdomain.com, ce est frustrant.)


Pour ledit site Web, cela est à peu près hors de propos car l'ensemble du site Web a changé, mais vous avez absolument raison. Le site Web doit être aussi rétrocompatible que possible. +1
Yuval Adam

2

Si vous souhaitez que la redirection complète un nouveau site (domaine) sans paramètres ni pages, utilisez ceci:

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

1
Cela ne fonctionnera pas comme prévu lorsqu'il est utilisé .htaccesscar il ne correspondra simplement à aucune URL dans la racine du document. Cela fonctionnerait dans une configuration de serveur ou dans un contexte VirtualHost.
MrWhite

2

J'ai essayé la réponse de user968421 et la solution de l'OP mais le navigateur a fait apparaître une erreur de sécurité pour une page de paiement. Je ne peux pas vous dire pourquoi exactement.

Notre hôte (Site Ground) n'a pas pu le comprendre non plus.

La solution finale était proche, mais un léger ajustement à la réponse de user968421 (note latérale: contrairement à l'OP, j'essayais de rediriger vers la page correspondante, pas seulement vers la page d'accueil, donc j'ai conservé la référence arrière [ $1après le domaine] de user968421's répondre):

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

Vous avez le tweak de ce générateur de redirection htaccess recommandé par un article Host Gator (temps désespérés, mesures désespérées, bien?).


2

Simple comme ça et cela ne portera pas la requête de fin d'URL vers un nouveau domaine.

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

qui a réellement fonctionné pour moi, besoin d'une solution sans passer de limace à un nouveau domaine Merci Dsynmphony
Faisal Mehmood Awan

1

Utilisez des redirections conditionnelles avec Options -FollowSymLinkset AllowOverride -Optionsdésactivées par l'hébergeur si quelques fichiers locaux doivent également être servis:

Exemple .htaccess

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

Cet exemple servira local index.html et redirigera tous les autres membres du personnel vers un nouveau domaine.


1

Essayez cette méthode pour tout rediriger vers le nouveau domaine de la page d'accueil, cela fonctionne pour moi:

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

0

Les réponses précédentes n'ont pas fonctionné pour moi.

J'ai utilisé ce code. Si vous utilisez OSX, assurez-vous d'utiliser le format correct.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.