redirecionamento apache de não www para www


206

Eu tenho um site que parece não redirecionar de não www para www.

Minha configuração do Apache é a seguinte:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

o que estou perdendo?


1
Para uma .htaccesssolução baseada sugiro uma resposta que foi colocada sobre a questão diametral: stackoverflow.com/a/5262044/367456
— hakre

isso é bom, mas adiciona uma barra ao URL, portanto, perca a barra antes do dólar.
— wuxmedia 16/09/19

Respostas:


510

Usar o mecanismo de reescrita é uma maneira bastante pesada de resolver esse problema. Aqui está uma solução mais simples:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

E então você terá outra <VirtualHost>seção com ServerName www.example.coma configuração real do servidor. O Apache preserva automaticamente qualquer coisa após o /uso da Redirectdiretiva , que é um equívoco comum sobre por que esse método não funciona (quando na verdade funciona).


20
Como você faz isso para um site que também possui um host virtual ssl?
— Shabbyrobe

28
Recebo o erro "A página da web em example.com resultou em muitos redirecionamentos" ao usar esta sugestão. Os outros têm esse problema?
— 28811 Jonathan Berger

4
@BlackDivine: Não há nada mágico em fazer isso na outra direção. Simplesmente troque www.examplee exampleonde quer que eles apareçam na amostra.
— Greg Hewgill

11
@ JonathanBerger Se você redirecionar demais, provavelmente não configurou bem o arquivo. Certifique-se de ter 2 VirtualHosts: um com não www, que é o acima, e outro com ServerName www.example.com, que tem a configuração real. Verifique também se não há um redirecionamento na configuração de www.example.com (mod_alias e mod_rewrite).
— Savas Vedova

3
Para um servidor host virtual, por exemplo, example.com, eu tenho, Redirect 301 / http://example2.com/extra/mas quando ele redireciona, perde a barra final, o que significa que isso example.com/blahocorre example2.com/extrablah. Alguma ideia? (Apache 2.2.22)
— Peter Howe

87

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
resposta muito curta ... mas para os pontos ... não tenho certeza se este é um para cima ou para baixo votação
— thecoshman

2
Ah, isso é legal, isso pode ser incluído na configuração do servidor no nível superior (e, se houver), será aplicado a todos os hosts virtuais!
— thenickdude

Olá @burzumko, como você consegue isso, o que é verdade para todos sem www, mas depois deixe, digamos, example.com/subdi1/ws/* passar sem www?
— sensei preto

1
Também usei esta solução para hosts virtuais HTTPS. Basta adicionar um sao http na terceira linha.
— Rodrigoap 12/09

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Isso não funcionou para mim; que causou um loop de redirecionamento infinito ao mesmo site
— dmiller309

1
@ dmiller309: Você incluiu www.no ServerAlias?
— Cherouvim

2
Você está certo, eu acidentalmente coloquei www. no ServerAlias ​​usando o *. curinga. Como eu atrapalhei a ordem das entradas do VirtualHost, o *. O curinga teve a oportunidade de corresponder quando não achei que fosse.
— dmiller309

7
Esta é a melhor resposta, porque é limpa, mantém o caminho (ao contrário da resposta nº 1) e não usa a opção Reescrever.
— schieferstapel 31/01

30

Para remover wwwdo seu URLsite, use este código no seu .htaccessarquivo:

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

Para forçar wwwseu site, URLuse este código em.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Onde YourSite.comdeve ser substituído pelo seu URL.


Melhor resposta aqui, pois funciona para sites com vários nomes de domínio <3
— Clement Herreman

2
Qual é a segunda parte do arquivo .html?
— Nathan H

6
Remova a barra antes de $ 1 para não ter barra dupla (//) após o redirecionamento => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
— Kevin Campion

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

É o que acontece com o código acima. O primeiro bloco de host virtual verifica se a solicitação é www.example.com e executa seu site nesse diretório.

Na sua falta, trata-se da segunda seção do host virtual. Aqui, qualquer coisa que não seja www.example.com é redirecionada para www.example.com.

A ordem aqui é importante. Se você adicionar a segunda diretiva virtualhost primeiro, ela causará um loop de redirecionamento.

Esta solução redirecionará qualquer solicitação para o seu domínio, para www.seudominio.com.

Felicidades!


16

Isso é semelhante a muitas das outras sugestões com algumas melhorias:

  • Não há necessidade de codificar o domínio (funciona com vhosts que aceitam vários domínios ou entre ambientes)
  • Preserva o esquema (http / https) e ignora os efeitos das %{REQUEST_URI}regras anteriores .
  • A parte do caminho não afetada pelo RewriteRules anterior %{REQUEST_URI}é.

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

4
Quase perfeito. Deve ser% {HTTP_HOST} $ 1, não% {HTTP_HOST} / $ 1 (ou ele vai dobrar a barra)
— Michael Wyraz

@ Michael Wyraz: Não dobra a barra aqui ?!
— not2savvy

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

Isso começa com a HTTP_HOSTvariável, que contém apenas a parte do nome de domínio da URL de entrada ( example.com). Supondo que o nome do domínio não contenha www.ae corresponda exatamente ao seu nome de domínio, o RewriteRule entra em ação. O padrão ^(.*)$corresponderá a tudo no REQUEST_URI, que é o recurso solicitado na solicitação HTTP ( foo/blah/index.html). Ele armazena isso em uma referência anterior, que é usada para reescrever a URL com o novo nome de domínio (que começa comwww ).

[NC]indica correspondência de padrão sem distinção entre maiúsculas e minúsculas, [R=301]indica um redirecionamento externo usando o código 301 (recurso movido permanentemente) e [L]interrompe toda a reescrita adicional e redireciona imediatamente.


6

Código de redirecionamento para não-www => www e oposto a www => não-www. Não há domínios codificados e esquemas no arquivo .htaccess. Portanto, o domínio de origem e a versão http / https serão preservados.

APACHE 2.4 E MAIS NOVO

NÃO-WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NÃO WWW:

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

Nota: não está funcionando no Apache 2.2 onde% {REQUEST_SCHEME} não está disponível. Para compatibilidade com o Apache 2.2, use o código abaixo ou substitua% {REQUEST_SCHEME} por http / https fixo.


APACHE 2.2 E MAIS NOVO

NÃO-WWW => WWW:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... ou versão mais curta ...

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

WWW => NÃO WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

... versão mais curta não é possível porque% N está disponível apenas no último RewriteCond ...


A configuração do Apache 2.4 corrigiu o problema, obrigado pela resposta limpa .. !!
— precisa saber é o seguinte

5

Eu corri isso ...

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

Eu preciso que isso seja universal para mais de 25 domínios em nosso novo servidor, portanto, esta diretiva está no meu arquivo virtual.conf em uma tag <Directory>. (dir é pai de todas as documentações)

Eu tive que fazer um pouco de invasão na regra de reescrita, pois a documentação completa estava sendo realizada na correspondência de padrões, apesar do que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html diz sendo apenas coisas após o host e a porta.


5

Se você estiver usando o Apache 2.4, sem a necessidade de ativar o módulo de reescrita do apache, poderá usar algo como isto:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
Resposta subestimada. Usando isso, vhosts adicionais podem ser evitados, o que é bom para scripts automatizados do Let'sEncrypt.
— Paul

Além disso, se você estiver usando ANSIBLE, desde o ANSIBLE 2.0 agora é possível inserir facilmente um bloco em um arquivo em uma tarefa, mais detalhes aqui docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
— sys0dm1n

3

Redirecione domain.tld para www.

As seguintes linhas podem ser adicionadas nas diretivas Apache ou no arquivo .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Outros sudomains ainda estão funcionando.
  • Não há necessidade de ajustar as linhas. apenas copie / cole-os no lugar certo.

Não se esqueça de aplicar as alterações do apache se você modificar o vhost.

(com base no Drupal7 .htaccess padrão, mas deve funcionar em muitos casos)


3

Isto é simples!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Isso redirecionará não apenas o nome do domínio, mas também as páginas internas. Como ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


Obrigado por isso. Muito útil.
— Anthony

2

Tente o seguinte:

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

2

Nem sempre use Redirect permanent (ou por que isso pode causar problemas no futuro)

Se houver uma chance de você adicionar subdomínios mais tarde, não use redirect permanent .

Porque se um cliente usou um subdomínio que não foi registrado como VirtualHost ele também pode nunca chegar a esse subdomínio, mesmo quando for registrado posteriormente.

redirect permanent envia um HTTP 301 Moved Permanently para o cliente (navegador) e muitos deles armazenam em cache essa resposta para sempre (até que o cache seja limpo [manualmente]). Portanto, o uso desse subdomínio sempre será redirecionado automaticamente para www. *** sem solicitar o servidor novamente.

consulte Por quanto tempo os navegadores armazenam em cache o HTTP 301s?

Então é só usar Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - Quando não usar mod_rewrite

Apache.org - Nomes de host canônicos


1

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

verifique este trabalho perfeito


1

-Se você hospedar vários nomes de domínio (opcional)

-Se todos esses nomes de domínio estiverem usando https (como deveriam)

-se você quiser que todos esses nomes de domínio usem www dot domainName

Isso evitará o redirecionamento duplo (http: // não www para http: // www e depois para https: // www)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

E

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

Você deve alterar o código de redirecionamento 301 para o mais conveniente



0

Isso funciona para mim:

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

Uso o padrão de antecipação (?!www.domain.com)para excluir o wwwsubdomínio ao redirecionar todos os domínios para o wwwsubdomínio, a fim de evitar um loop infinito de redirecionamento no Apache.


0

O código que eu uso é:

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

-1

Se estiver usando a solução acima de dois <VirtualHost *:80>blocos com diferentes ServerName...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... então você deve definir NameVirtualHost Ontambém .

Se você não fizer isso, o Apache não se permitirá usar os diferentes ServerNames para distinguir os blocos, então você recebe esta mensagem de erro:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... e nenhum redirecionamento acontece ou você tem um loop de redirecionamento infinito, dependendo do bloco que você colocar primeiro.


-1

Eu tive uma tarefa semelhante em um WP Multisite, onde a regra de redirecionamento tinha que ser genérica (para qualquer domínio que eu adicionaria à rede). Resolvi primeiro adicionar um curinga ao domínio (domínio estacionado). Note o . depois de .com.

CNAME * domain.com.

E adicionei as seguintes linhas ao arquivo .htaccess na raiz do meu multisite. Eu acho que funcionaria para qualquer site.

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

Espero que isso ajude.

ps. Se você deseja redirecionar de não www para www, altere a última linha para

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

-2

Achei mais fácil (e mais útil) usar o ServerAlias ​​ao usar vários vhosts.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Isso também funciona com https vhosts.


Outro drive-by voto negativo. Importa-se de explicar, oh poderoso deus do httpd, que não se incomodou em explicar o voto negativo?
— Anthony

1
Isso faz com que você tenha vários domínios hospedando o mesmo site. Dependendo das suas situações e do que o servidor da Web subjacente está executando, você terá problemas com cookies que não são transferidos, pessoas confusas e problemas nos mecanismos de pesquisa (que serão vistos como 2 sites diferentes).
— Jeffrey Van Alstine
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.