.htaccess redireciona todas as páginas para o novo domínio


218

Qual regra de redirecionamento eu usaria para redirecionar todas as páginas olddomain.examplea serem redirecionadas newdomain.example?

O site tem uma estrutura totalmente diferente, portanto, desejo que todas as páginas do domínio antigo sejam redirecionadas para a nova página de índice do domínio .

Eu pensei que isso faria (no diretório base olddomain.example):

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

Mas se eu navegar para, olddomain.example/somepagesou redirecionado para newdomain.example/somepage. Estou esperando um redirecionamento apenas para newdomain.examplesem o sufixo da página.

Como mantenho a última parte de fora?


8
Para economizar tempo, desloque-se para a direita melhor resposta que é RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Kai Noack

2
Vale ressaltar que, particularmente da perspectiva de SEO, ter um redirecionamento muitos para um para o índice / página inicial geralmente é uma má idéia. É provável que o Google o veja como um soft-404.
precisa saber é o seguinte

Respostas:


201

Pode ser assim:

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

Hum, você pode tentar recarregar seu navegador? é até redirecionando com xampp aqui. Acabei de testar.
VOCÊ

Meu mal ... ele funciona, meu serviço de hospedagem tinha algum outro redirecionamento no qual estava tudo errado. Obrigado! :)
Yuval Adam

25
Não seria RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts

1
Depois de um longo inverno, editei o código para que finalmente funcionasse. (o correto é redirecionar se IGUAL e não DIFERENTE para domínio antigo, esse foi o problema) #
carla

5
@JimGeurts Somente se você quiser redirecionar TUDO que não seja novo domínio. No entanto, nesse caso, queríamos redirecionar SOMENTE o domínio antigo.
Carla

442

A resposta abaixo pode causar um loop infinito de redirecionamento ...

Aqui, este redireciona tudo após o nome do domínio no URL para a mesma cópia exata no novo URL do domínio:

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

www.example.net/somepage.html?var=foo redireciona para www.newdomain.com/somepage.html?var=foo


21
isso não redirecionará TODAS as solicitações, mesmo as de newdomain.com? E, essencialmente, causar duas solicitações duplicadas nesses casos?
Bill Dami

33
A questão é redirecionar tudo para a página inicial
kravits88

28
Embora essa não seja a resposta da pergunta, mas eu cheguei a essa pergunta da SE buscando exatamente essa resposta. obrigado !!!
dav

Como podemos fazer o redirecionamento do subdomínio para o novo domínio?
Sukhjinder Singh

2
Alguém poderia responder à pergunta de Bill, por favor. Isso não deve usar um RewriteCond para impedir uma solicitação duplicada e / ou regravações desnecessárias? Suponho que não teria nenhum impacto perceptível reescrever todas as vezes, mesmo que não seja necessário. Mas por que fazer isso?
28416 Andrew Andrew

80

Apenas para esclarecer, depois de remover o redirecionamento de hospedagem que estava no caminho, minha solução original também funciona:

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

Isso será redirecionado para o índice padrão, que era a sua pergunta. Apenas para maior clareza, pois, devido à proximidade, sua declaração parece direcionada para a resposta do usuário968421 logo acima disso, a resposta do usuário968421 está correta quando a intenção é redirecionar para um nome de arquivo correspondente no novo domínio.
RationalRabbit

19

Eu usei para o meu blog Wordpress isso como .htaccess. Ele converte http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad etc, em http: //blah.example/asad Obrigado a todos outras respostas eu descobri isso.

<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 esta a resposta mais abrangente de todas: preserva a classificação para todas as páginas e é uma possibilidade para todos os domínios que não são os principais! O que poderia ser melhor?
Nzn 5/08

1
A chave aqui é que a regra de reescrita de domínio vem antes da regra de reescrita do índice do 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>

Isso funcionou para mim


Sim, esse método seria limpo e agradável !, funcionou para mim também.
Cody

Isto irá redirecionar com o parâmetro na URL, se houver - index.php? aa = 9 levará o parâmetro para novo domínio
Darksymphony

13

Existem várias maneiras de fazer isso e vários redirecionamentos, listei-os abaixo:

Redirecionamento 301 (permanente): aponte um site inteiro para um URL diferente em uma base permanente. Esse é o tipo mais comum de redirecionamento e é útil na maioria das situações. Neste exemplo, estamos redirecionando para o domínio "example.com":

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

Redirecionamento 302 (temporário): aponte um site inteiro para um URL temporário diferente. Isso é útil para fins de SEO quando você tem uma página de destino temporária e planeja voltar à página de destino principal em uma data posterior:

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

Redirecione index.html para uma subpasta específica:

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

Redirecione um arquivo antigo para um novo caminho de arquivo:

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

Redirecione para uma página de índice específica:

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

Se você adicionar US $ 1 para o primeiro exemplo, como este Redirect 301 / http://example.com/$1 , em seguida, todas as páginas do site original será redirecionado para a nova raiz do site
Yassine mokni

@YassinMK Não $1é necessário aqui, você está pensando na RedirectMatchdiretiva (mas ainda assim você precisaria definir um grupo de captura para a $1referência).
precisa saber é o seguinte

Embora todas essas Redirectdiretivas sejam redirecionadas da mesma maneira, enquanto o OP está querendo redirecionar apenas para a página inicial do novo site (embora isso por si só não seja recomendado). Pode ser necessário usar a RedirectMatchdiretiva se você quiser apenas redirecionar para um URL específico.
precisa saber é o seguinte

em vez de 301, você também poderia escrever redirecionamento permanente / h ttps: //www.example.com, você pode fazer isso no arquivo vhost
Yvon Huynh

Mas a questão relacionada ao .htaccess, por que mencionar o arquivo vhost?
RustyIngles

9

Se você deseja redirecionar de algum local para subdomínio, você pode usar:

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


É a melhor maneira. Porque muitos Webhosters não permitiram o uso do RewriteEngine no .htaccess. Isso funciona muito bem de qualquer maneira!
Sprinterfreak

Você deve usar RewriteEngine para redirecionar. O motivo pelo qual você teve problemas é que o RewriteEngine já estava ativo e você precisava apenas de regras de redirecionamento. Estou feliz que ajudou.
EmptySD

Não é verdade. Ele pula todas as coisas de reescrita e, ao usar, RewriteEngine Onlança 500 de erro interno. É um espaço da Web muito restrito. Usar Redirect 301 / http://fooé a única maneira possível de lidar.
Sprinterfreak

6

Se o novo domínio para o qual você está redirecionando o site antigo estiver em um host diferente, você pode simplesmente usar um Redirect

Redirect 301 / http://newdomain.com

Isso redirecionará todas as solicitações de olddomainpara o newdomain.

RedirectA diretiva não funcionará ou poderá causar um Redirect loopse seu domínio novo e domínio antigo estiverem no mesmo host; nesse caso, você precisará usar o mod-rewriteredirecionamento com base no cabeçalho do host solicitado.

RewriteEngine on


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

5

Minha reputação não permitirá que eu comente uma resposta, mas eu só queria ressaltar que a resposta mais bem avaliada aqui tem um erro:

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

deve ter uma barra antes dos US $ 1, então

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

3

Minha solução como SymLinks não funcionou no meu servidor, então usei um If no meu 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

Este é um erro nas versões mais antigas do apache (e, portanto, mod_rewrite), em que o prefixo do caminho foi anexado ao caminho reescrito, se alterado. Veja aqui

Eu acho que foi corrigido no apache2 V2.2.12, há um sinalizador especial que você precisa usar, que adicionarei aqui quando o encontrar (acho que era NP para No Path)

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

Eu bati minha cabeça contra isso por quase um mês #
Mark Question

2

Do ponto de vista da usabilidade, seria melhor se você também enviasse o caminho com a solicitação (ou seja, o que você tem no momento) e deixe o seu novo site lidar com isso:

Você procurou por "/ produtos".

Infelizmente esta página se foi. Gostaria de visitar "/ new_products"?

(e melhor ainda, fazer isso automaticamente.)

Obviamente, existem muitas codificações e heurísticas para um site maior, mas, na minha opinião, valeria a pena em termos de satisfação do usuário (quando o marcador cuidadosamente salvo do produto dos seus sonhos o leva à primeira página do newdomain.com, isso é frustrante.)


Para esse site, isso é irrelevante, pois todo o site mudou, mas você está absolutamente correto. O site deve ser o mais compatível possível com versões anteriores. +1
Yuval Adam

2

Se você deseja que o redirecionamento complete um novo site (domínio) diferente sem parâmetros ou páginas, use este:

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

1
Isso não funcionará conforme o esperado quando usado .htaccess, pois simplesmente não corresponderá a nenhum URL na raiz do documento. Funcionaria em uma configuração de servidor ou no contexto do VirtualHost.
precisa saber é o seguinte

2

Tentei a resposta do usuário968421 e a solução do OP, mas o navegador exibiu um erro de segurança para uma página de checkout. Eu não posso te dizer por que exatamente.

Nosso anfitrião (Site Ground) também não conseguiu descobrir.

A solução final estava próxima, mas um pequeno ajuste na resposta do usuário968421 (observação: ao contrário do OP, eu estava tentando redirecionar para a página correspondente, não apenas para a página inicial, por isso mantive a referência anterior [ $1depois do domínio] do usuário968421 responda):

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

Obteve o ajuste deste gerador de redirecionamento htaccess recomendado por um artigo do Host Gator (tempos de desespero, medidas desesperadas, certo?).


2

Simples assim e isso não levará a consulta à direita do URL para o novo domínio.

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

que realmente funcionou para mim, preciso de uma solução sem passar nenhuma lesma para um novo domínio Obrigado Dsynmphony
Faisal Mehmood Awan

1

Use redirecionamentos condicionais com Options -FollowSymLinkseAllowOverride -Options desabilitado pelo Hoster se alguns arquivos locais também devem ser exibidos:

Sample .htaccess

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

Este exemplo servirá index.html local e redirecionará todas as outras equipes para o novo domínio.


1

Tente este método para redirecionar todos para o novo domínio da página inicial, funciona para mim:

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

0

As respostas anteriores não funcionaram para mim.

Eu usei esse código. Se você estiver usando o OSX, use o formato correto.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.