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.