Redirecione não www para www em .htaccess

188

Eu tenho isso no meu arquivo .htaccess:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com$1 [R=301,L]

mas sempre que eu acessar um arquivo na minha raiz, http://example.com/robots.txtele será redirecionado para http://www.example.comrobots.txt/.

Como posso corrigir isso para que ele seja redirecionado corretamente para http://www.example.com/robots.txt?

Paul Sanchez
fonte

Respostas:

388

Altere sua configuração para isso (adicione uma barra):

RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule (.*) http://www.example.com/$1 [R=301,L] 

Ou a solução descrita abaixo (proposta por @absiddiqueLive ) funcionará em qualquer domínio:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Se você precisar oferecer suporte a http e https e preservar a opção de protocolo, tente o seguinte:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Onde você substitui loginpor checkout.phpou qualquer URL que você precisa para suportar HTTPS.

Eu diria que isso é uma péssima idéia. Para o raciocínio , leia esta resposta .

Randall Hunt
fonte
Esta solução não funciona quando algumas páginas (como login ou inscrição) usam o protocolo https.
Alexey Kosov #
Atualizei a postagem um pouco para incluir algumas informações. É difícil escolher genericamente e corretamente o protocolo a ser usado.
Randall caça
2
A primeira solução não redireciona o suficiente, a segunda parece redirecionar demais. Por exemplo, blog.example.comtornawww.blog.example.com
gman
Você também pode adicionar como evitar o redirecionamento durante o desenvolvimento no host local?
Bugs Bunny
Eu tenho acompanhado tudo aqui, mas nada está funcionando. Estou usando uma configuração laravel. Alguém tem alguma idéia de por que isso não está funcionando para mim? www.domain.com e domain.com são carregados corretamente, mas domain.com não é redirecionado para www.domain.com. Isso pode ser um problema com o meu DNS?
Olá mundo
92

Aqui está a solução correta que suporta https e http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Alexey Kosov
fonte
7
Isso é perfeito, também não redireciona os subdomínios para wwwoutras soluções genéricas.
Fabian Schmengler
4
Esta é a melhor solução, funciona muito melhor do que a resposta aceita, e cuida de HTTPS corretamente
TAMIK Soziev
3
Funciona perfeitamente! E em tão poucas linhas!
Zeckdude
7
Esta é a melhor resposta
Andrew
7
Se não me engano, isso não funcionaria por mais de um ponto. Exemplos:yoursite.co.uk
TrashyMcTrash
82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Para Https

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddiqueLive
fonte
7
Essa solução é preferida à do @ ranman, pois funcionará para todos os domínios, minimizando o erro humano quando você estiver implementando o código para um novo projeto ou quando você implementa domínios extras em um projeto existente.
Frankie
Eu prefiro esta solução, mas por que em ^(.*)$vez de (.*)?
Popnoodles
esta solução é melhor, mas eu editei o meu para conter o seu também.
Randall Hunt
1
Isso está funcionando para todos os domínios, é simples e eficaz! Obrigado
eirenaios
você pode seguir RewriteCond% {HTTPS} s ^ em (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive
23

O exemplo a seguir funciona com SSL e não SSL e é muito mais rápido, pois você usa apenas uma regra para gerenciar http e https

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[Testado]

Isso redirecionará

http

para

https

para

starkeen
fonte
1
Muito perto do que eu criei. Também suporta mais de um ponto no host HTTP, por exemplo "mysite.co.uk".
Adambean
2
Por curiosidade, por que você não está usando R = 301 aqui? Ele usará 302 (temperatura movida) por padrão, se nenhum código for especificado.
Marc
1
Funciona perfeitamente. Essa deve ser a resposta aceita.
James Nisbet
8

Tente isso, usei em muitos sites, funciona perfeitamente

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
fonte
4

Eu testei todas as soluções acima, mas não está funcionando para mim, tentei remover o http: // e não redirecionarei também removi o www, ele redireciona bem, por isso fico confuso, especialmente estou executando todos os meus sites em https : //

Então, eu combinei alguns códigos e criei a solução perfeita para http: // e https: // e www e não www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Espero que isso possa ajudar alguém :)

Mizo Games
fonte
3

Essa configuração funcionou para mim no bitnami wordpress com SSL configurado:

Adicionado o abaixo em "RewriteEngine On" no arquivo /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
fonte
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

Isso redirecionará seu domínio, que não foi iniciado com WWW. Ele não redirecionará todos os seus subdomínios.

É útil.

Ashish Gondaliya
fonte
2

Acredito que a resposta principal redireciona com êxito os sites não www para www (ex: mysite.com -> www.mysite.com ), mas não leva em consideração os subdomínios curinga, o que resulta em:

random.mysite.com -> www.random.mysite.com

Aqui está uma solução com / sem HTTPS

HTTP

RewriteEngine On

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ %{ENV:protocol}://www.mysite.com/$1 [L,R=301]

* observação: não testei https porque atualmente não tenho um certificado para testar, mas se alguém puder verificar ou otimizar o que tenho, isso seria incrível.

Hunter Frazier
fonte
O que o primeiro $ faz aqui: '^ (. *) $'
Vaishal Patel
0

Se possível, adicione-o ao arquivo de configuração principal do Apache. É uma solução mais leve, com menos processamento necessário.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Portanto, o separado VirtualHostpara "example.com" captura essas solicitações e as redireciona permanentemente para o seu principalVirtualHost . Portanto, não há REGEX analisando todas as solicitações, e os navegadores clientes armazenam em cache o redirecionamento para que nunca (ou raramente) solicitem o URL "errado" novamente, economizando a carga do servidor.

Observe que a barra final Redirect permanent / http://www.example.com/. Sem ele, um redirecionamento de example.com/asdfseria redirecionado para em http://www.example.comasdfvez de http://www.example.com/asdf.

Buttle Butkus
fonte
0

Dois avisos

Evite o 301 e prefira os modernos códigos de status de resposta 303 ou 307.

Evite 301

Pense com cuidado se você realmente precisa do redirecionamento permanente indicado como [R=301] pois se você decidir alterá-lo mais tarde, os visitantes anteriores da página continuarão vendo a página do redirecionamento original.

As informações de redirecionamento permanente são frequentemente armazenadas no cache do navegador e, em geral, é difícil de eliminar (recarregar a página não resolve o problema). Os visitantes do seu site ficarão presos no redirecionamento anterior "para sempre".

Evite 302 também

A nova versão do protocolo HTTP (v1.1) adicionou dois novos códigos de status de resposta que podem ser usados ​​em vez de 302.

  • 303 Redirecionamento de URL, mas exigindo alterar o tipo de solicitação para GET.
  • 307 Redirecionamento de URL, mas exigente para manter o tipo de solicitação como enviado inicialmente.

Você ainda pode usar o código 302(redirecionamento não permanente), embora seja considerado ambíguo. De qualquer forma, a maioria dos navegadores implementa 302da mesma maneira que o novo 303código instrui.

ePi272314
fonte
em relação ao seu aviso sobre 301, isso se aplicará mesmo se estivermos falando sobre o mesmo nome de domínio? não tenho tanta certeza de como isso se aplicará neste caso ... redirecionando todos os URLs de http://example.com/testingpara http://www.example.com/testing. Poderia ser uma má abordagem a longo prazo? Obrigado,
Sara_
-1

Escreva em .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
fonte
1
Same as other answers
Ankit