.htaccess - como forçar “www.” de forma genérica?


102

Isso mudará domain.compara www.domain.com:

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

Como faço para substituir a parte "domínio" para que funcione em qualquer domínio?

Respostas:


249

Eu usaria esta regra:

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

A primeira condição verifica se o valor do Host não está vazio (no caso de HTTP / 1.0); o segundo verifica se o valor do Host não começa com www.; os terceiros controlos para HTTPS ( %{HTTPS}seja onou off, de modo que %{HTTPS}sé ou onsou offse no caso de onso sé compensada). A parte de substituição de RewriteRuleentão apenas mescla as partes de informações em um URL completo.


31
Esta solução funciona apenas se você quiser que todos os subdomínios sejam encaminhados para www.yourdomain.com. Se você deseja apenas forçar www, você deve atualizar a segunda linha para ser:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky

2
Não recebo nenhum dos meus subdomínios encaminhados para www.mydomain.com usando a regra postada na pergunta ...
lol

3
muito esperto! Gosto de você ter forçado a verificação de HTTPS a retornar um "S" no grupo de captura, que você usou na linha a seguir. muito elegante
code_monk de

Parece uma resposta universal, cobre HTTPs e protocolos normais, funciona perfeitamente.
Clain Dsilva

1
Obrigado! Eu adicionaria RewriteEngine Oncomo a primeira linha para completá-lo, pois isso poderia levar a um erro de servidor 500 se copiado e colado como está.
Ryan Casas,

44

Isso vai resolver:

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

5

Se você deseja redirecionar todas as solicitações não www para o seu site para a versão www, tudo o que você precisa fazer é adicionar o seguinte código ao seu arquivo .htaccess:

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

3

Isso não funcionará com subdomínios.

domain.com é redirecionado corretamente para www.domain.com

mas

images.domain.com é redirecionado para www.images.domain.com

Em vez de verificar se o subdomínio é "não www", verifique se há dois pontos:

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

Eu gosto dessa solução. Como conseguir o mesmo com TLDs como .co.uk?
TylersSN

1
@iUseMagentoNow basta aumentar os pontos, por exemplo: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](falando estritamente, seu TLD ainda é .uke seu domínio é something.co.)
mirabilos

.co, neste caso, é um domínio de segundo nível e não é realmente uma parte de seu domínio, enquanto .uk é um TLD com código de país. Para ser honesto, tendo trabalhado na indústria de hospedagem e visto os novos formatos de nomes de domínio, não consigo ver os formatos de TLD atuais durando para qualquer outro uso que não seja oficial. governos, organizações etc. Em um futuro próximo, quando você puder registrar fqdn like, fred.bloggs por um preço semelhante às normas atuais, a web pessoal parecerá muito diferente do ponto de vista do DNS.
Chris

1

O seguinte deve prefixar 'www' para qualquer solicitação que não tenha um e redirecionar a solicitação editada para o novo URI.

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

1
RewriteEngine On

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Isso redireciona example.compara a www.example.comexclusão de subdomínios.


Para mim, isso parece estar enviando www.example.com para www.example.com haha
Albert Renshaw

@Albert Talvez seja por causa do cache do seu navegador. Limpe seu cache e tente novamente.
Amit Verma

Você está certo! Acabei de correr em incógnito (cromo) e funcionou bem, obrigado!
Albert Renshaw

1
Eu gosto muito dessa regra genérica. Mas não funciona para domain.co.uk , pois já tem dois pontos nele. Como essa regra pode ser alterada para que funcione também para .co.uk?
Sacha Vorbeck

1
Para .co.uk e outros sub-cctlds isso funciona: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Mas, infelizmente, há alguns mistos tlds digitados ( wiki.mozilla.org/TLD_List ) como es que permitem domain.es bem como domain.com.es. Adicionar | es ao regex corresponderia a domain.es, bem como a www.domain.es, o que não é desejado aqui. Tenho que encontrar uma maneira de lidar com esses sub-cctlds com tipos mistos
Sacha Vorbeck


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.