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?

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 .


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]

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]

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


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]

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



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]

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.


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.


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 me@example.com
   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.


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.


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]

1
Same as other answers
— Ankit
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.