.htaccess redirige todas las páginas al nuevo dominio

218

¿Qué regla de redireccionamiento usaría para redirigir todas las páginas olddomain.examplea las que se redirigirá newdomain.example?

El sitio tiene una estructura totalmente diferente, por lo que quiero que cada página del dominio anterior se redirija a la nueva página de índice de dominio .

Pensé que esto haría (en el directorio base olddomain.example):

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

Pero si navego hacia, olddomain.example/somepageme redirigen a newdomain.example/somepage. Espero una redirección solo newdomain.examplesin el sufijo de la página.

¿Cómo mantengo la última parte?

Yuval Adam
fuente
8
Para ahorrar tiempo, desplácese hacia abajo hasta la mejor respuesta correcta que es RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack
2
Vale la pena señalar que, particularmente desde una perspectiva de SEO, tener una redirección de muchos a uno a la página de inicio / índice generalmente es una mala idea. Es probable que Google lo vea como un soft-404.
MrWhite

Respuestas:

201

Puede ser así:

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

fuente
Um, ¿podrías intentar recargar tu navegador? incluso está redirigiendo con xampp aquí. Acabo de probar.
USTED
Lo malo ... funciona, mi servicio de alojamiento tenía alguna otra redirección en la que estaba jodidamente. ¡Gracias! :)
Yuval Adam
25
¿No sería así RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts
1
Después de un largo invierno, edité el código para que finalmente pueda funcionar. (lo correcto es redirigir si ES IGUAL y NO DIFERENTE al antiguo dominio, ese fue el problema)
carla
55
@JimGeurts Solo si desea redirigir TODO lo que no sea newdomain. Sin embargo, en este caso, queríamos redirigir SOLAMENTE olddomain.
carla
442

La respuesta a continuación podría causar un bucle de redireccionamiento infinito ...

Aquí, este redirige todo después del nombre de dominio en la URL a la misma copia exacta en la nueva URL de dominio:

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

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

Chris Stryczynski
fuente
21
Sin embargo, ¿esto no redirigirá CADA solicitud, incluso las de newdomain.com? ¿Y esencialmente causa dos solicitudes duplicadas en esos casos?
Bill Dami
33
La pregunta es redirigir todo a la página de inicio
kravits88
28
Aunque esta no es la respuesta de la pregunta, llegué a esta pregunta desde SE buscando exactamente esta respuesta. Gracias !!!
DAV
¿Cómo podemos hacer para redirigir del subdominio al nuevo dominio?
Sukhjinder Singh
2
¿Podría alguien responder la pregunta de Bill por favor? ¿No debería esto usar un RewriteCond para evitar una solicitud duplicada y / o reescrituras innecesarias? Supongo que no tendría ningún impacto notable reescribir cada vez que no sea necesario. Pero por qué hacerlo.
Andrew
80

Solo para aclarar, después de eliminar la redirección de alojamiento que estaba en el camino, mi solución original también funciona:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]
Yuval Adam
fuente
Esto redirigirá al índice predeterminado, que es de lo que se trataba su pregunta. Solo por claridad, dado que, debido a la proximidad, su declaración parece estar dirigida hacia la respuesta del usuario 968421 justo encima de esto, la respuesta del usuario 968421 es correcta cuando la intención es redirigir al nombre de archivo correspondiente en el nuevo dominio.
RationalRabbit
19

Lo he usado para mi blog de Wordpress como .htaccess. Convierte http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad , etc., a http: //blah.example/asad Gracias a todos otras respuestas me di cuenta de esto.

<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
fuente
2
Considero que esta es la respuesta más completa de todas: ¡conserva el ranking para cada página y es una atracción para todos los dominios que no son los principales! ¿Que podría ser mejor?
nzn
1
La clave aquí es que la regla de reescritura de dominio viene antes que la regla de reescritura de índice de 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>

Esto funciono para mi

Iana Sergieieva
fuente
Sí, este método sería limpio y agradable, también funcionó para mí.
Cody
esto redirigirá con el parámetro en URl si hay alguno - index.php? aa = 9 llevará el parámetro a un nuevo dominio
Darksymphony
13

Hay varias formas de hacer esto y varias redirecciones, las he enumerado a continuación:

Redirección 301 (permanente): apunte un sitio completo a una URL diferente de forma permanente. Este es el tipo más común de redireccionamiento y es útil en la mayoría de las situaciones. En este ejemplo, estamos redirigiendo al dominio "ejemplo.com":

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

Redirección 302 (temporal): apunte un sitio completo a una URL temporal diferente. Esto es útil para fines de SEO cuando tiene una página de destino temporal y planea volver a su página de destino principal más adelante:

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

Redireccionar index.html a una subcarpeta específica:

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

Redireccionar un archivo antiguo a una nueva ruta de archivo:

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

Redireccionar a una página de índice específica:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html
RustyIngles
fuente
Si agrega $ 1 al primer ejemplo, de esta manera Redirect 301 / http://example.com/$1 , todas las páginas del sitio original serán redirigidas a la nueva raíz del sitio
Yassine Mokni
@YassinMK No $1se requiere aquí, está pensando en la RedirectMatchdirectiva (pero aún así necesitaría definir un grupo de captura para la $1referencia).
MrWhite
Aunque todas estas Redirectdirectivas redirigirán de igual a igual, mientras que el OP desea redirigir solo a la página de inicio del nuevo sitio (aunque eso en sí mismo no es recomendable). Es posible que deba usar la RedirectMatchdirectiva si solo desea redirigir a una URL específica.
MrWhite
en lugar de 301 también podría escribir Redirect permanente / h ttps: //www.example.com, puede hacerlo en el archivo vhost
Yvon Huynh
Pero la pregunta relacionada con .htaccess, ¿por qué mencionar el archivo vhost?
RustyIngles
9

Si desea redirigir desde alguna ubicación al subdominio, puede usar:

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

EmptySD
fuente
Es la mejor manera. Porque muchos Webhosters no permitieron el uso de RewriteEngine en .htaccess. ¡Esto funciona muy bien de todos modos!
Sprinterfreak
Debe usar RewriteEngine para redirigir. La razón por la que tuvo problemas es que RewriteEngine ya estaba activo y solo necesitaba una regla de redireccionamiento. Me alegro de que eso haya ayudado.
EmptySD
No es verdad. Se salta todo lo de reescritura y cuando se usa RewriteEngine Onthrows 500 Internal Error. Es un espacio web muy restringido. Usar Redirect 301 / http://fooes la única forma posible de tratar.
Sprinterfreak
6

Si el nuevo dominio al que está redirigiendo su sitio anterior está en un host diferente, simplemente puede usar un Redirect

Redirect 301 / http://newdomain.com

Esto redirigirá todas las solicitudes de olddomaina newdomain.

Redirectla directiva no funcionará o puede causar un problema Redirect loopsi su nuevo dominio y su antiguo dominio están en el mismo host, en ese caso deberá usar mod-rewritepara redirigir según el encabezado del host solicitado.

RewriteEngine on


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

Mi reputación no me permite comentar una respuesta, pero solo quería señalar que la respuesta mejor calificada aquí tiene un error:

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

debería tener una barra inclinada antes de $ 1, así que

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

Mi solución como SymLinks no funcionaba en mi servidor, así que usé un If en mi 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
fuente
2

Este es un error en versiones anteriores de apache (y, por lo tanto, mod_rewrite) donde el prefijo de ruta se agregó a la ruta reescrita si se cambió. Mira aquí

Creo que se solucionó en apache2 V2.2.12, hay una bandera especial que debe usar que agregaré aquí cuando la encuentre (creo que fue NP para Sin ruta)

RewriteRule ^(.*)$ http://newdomain.com/ [??]
Signo de interrogación
fuente
Me golpeé la cabeza contra esto durante casi un mes
signo de interrogación el
2

Desde el punto de vista de la usabilidad, sería mejor si también envía la ruta con la solicitud (es decir, lo que tiene en este momento) y deja que su nuevo sitio se ocupe de ella:

Has buscado "/ productos".

Lamentablemente esta página se ha ido. ¿Desea visitar "/ new_products" en su lugar?

(y mejor aún, haciendo esto automáticamente).

Obviamente, esto es una gran cantidad de codificación y heurística para un sitio web más grande, pero en mi opinión sería rentable en términos de satisfacción del usuario (cuando su marcador guardado cuidadosamente del producto de sus sueños solo lo lleva a la página principal de newdomain.com, esto es frustrante)

Boldewyn
fuente
Para dicho sitio web esto es prácticamente irrelevante ya que todo el sitio web ha cambiado, pero tiene toda la razón. El sitio web debe ser lo más compatible posible con versiones anteriores. +1
Yuval Adam
2

Si desea redirigir para completar un nuevo sitio (dominio) diferente sin parámetros o páginas, use esto:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]
MCurbelo
fuente
1
Esto no funcionará como se espera cuando se usa, .htaccessya que simplemente no coincidirá con ninguna URL en la raíz del documento. Funcionaría en una configuración de servidor o contexto VirtualHost.
MrWhite
2

Intenté la respuesta del usuario 968421 y la solución del OP, pero el navegador apareció un error de seguridad para una página de pago. No puedo decirte por qué exactamente.

Nuestro anfitrión (Site Ground) tampoco pudo resolverlo.

La solución final fue cercana, pero un ligero ajuste a la respuesta del usuario 968421 (nota al margen: a diferencia del OP, estaba tratando de redirigir a la página correspondiente, no solo a la página de inicio, así que $1mantuve la referencia posterior [ después del dominio] del usuario968421 responder):

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

Obtuve el ajuste de este generador de redireccionamiento htaccess recomendado por un artículo de Host Gator (tiempos desesperados, medidas desesperadas, ¿verdad?).

J mayo
fuente
2

Simple como este y esto no llevará la consulta final de la URL al nuevo dominio.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]
Darksymphony
fuente
que realmente funcionó para mí, necesito una solución sin pasar cualquier babosa a un nuevo dominio Gracias Dsynmphony
Faisal Mehmood Awan
1

Utilice redireccionamientos condicionales con Options -FollowSymLinksy AllowOverride -Optionsdeshabilitados por el Hoster si también se deben servir algunos archivos locales:

Muestra .htaccess

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

Este ejemplo servirá local index.html y redirigirá a todo el resto del personal al nuevo dominio.

Sprinterfreak
fuente
1

Prueba este método para redirigir todo al nuevo dominio de la página de inicio, funciona para mí:

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

Las respuestas anteriores no me funcionaron.

Usé este código. Si está utilizando OSX, asegúrese de usar el formato correcto.

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