O htaccess genérico redireciona www para não-www

484

Eu gostaria de redirecionar www.example.compara example.com. O seguinte código htaccess faz isso acontecer:

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

Mas, existe uma maneira de fazer isso de maneira genérica sem codificar o nome de domínio?

deepwell
fonte
64
É importante estar ciente de que, se você não usar um www (ou outro subdomínio), todos os cookies serão enviados a todos os subdomínios e você não poderá ter um subdomínio sem cookies para exibir conteúdo estático, reduzindo assim o quantidade de dados enviados entre o navegador e o servidor. Algo que você mais tarde pode vir a lamentar: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Outra coisa a considerar, verifique se você está definindo o nome canônico sem o www em suas páginas, para evitar uma possível penalidade de conteúdo duplicado. Além disso, se você tiver URLs absolutos nos seus links, verifique também se todos não são www.
Jeremy Morgan
Em minha opinião, é melhor manter o redirecionamento explícito, especialmente ao copiar a configuração para outro domínio, que pode exigir ajustes diferentes (o domínio www é melhor em alguns casos) weboptimizer.ch/2014/01/redirection-www
snowflake
Alguma razão pela qual essa solução funcionaria para todos os casos, exceto o URL raiz? Por exemplo, domain.com não é pioneiro em domain.com , enquanto domain.com/page1 redireciona para domain.com/page1 .
Jeff Solomon
Se você deseja redirecionar www para não-www enquanto mantém o protocolo (HTTP ou HTTPS), consulte esta pergunta relacionada: Redirecionando www para não-www enquanto mantém o protocolo HTTP ou HTTPS
MrWhite

Respostas:

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

O mesmo que o de Michael, exceto que este funciona: P

Volomike
fonte
16
Se não funcionar, provavelmente está faltando o RewriteEngine Onprecursor para fazê-lo funcionar.
Hendry 25/05
8
@ Ben, como eu usaria isso ao contrário, para adicionar www a um site não www?
Anarkhos
18
Ele redireciona http://www.domain.com/para http://domain.com//. Você deve adicionar /ao RewruteRule. Isso funciona para mim RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov
13
Eu estava tendo o mesmo problema que Vladimir ao redirecionar para http://domain.com//com as barras duplas. Então eu fiz RewriteRule ^(.*)$ http://%1$1 [R=301,L] e ele parece estar funcionando até agora
bobfet1
5
Utilize a seguinte solução, em vez de mecanismo de reescrita, é muito mais rápido, enquanto ser elegante: stackoverflow.com/questions/1100343/...
Birla
111

Mas se precisarmos fazer isso para http e https separados:

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Andron
fonte
2
www.example.com/ redireciona para example.com// Alguma maneira de remover a barra extra?
Bobby S
Boa pergunta. Eu acho que a solução rápida será usar regras adicionais (ou seja, apenas para este caso) antes das descritas acima. Exemplo: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron 13/06
3
@BobbyS Eu usei a solução neste artigo . Ele redireciona www e HTTP para HTTPS não www e também lida com o final /.
precisa saber é o seguinte
Você só obteria uma barra extra (no início do caminho da URL), se tivesse colocado essas diretivas diretamente na configuração do servidor (ou no host virtual). Em .htaccessvocê não deve estar recebendo uma barra extra. (Só para observar, se você estiver executando esse redirecionamento na configuração do servidor, provavelmente não deve usar o mod_rewrite para começar ... um simples mod_alias Redirectno contêiner vhost apropriado seria mais eficiente e menos propenso a erros.)
MrWhite
72

Redirecionar não www para www (ambos: http + https)

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Dmitriy
fonte
4
@nightcoder Isto é porque o meu solução para redirecionamento inversa (dos não-www para www) em oposição a Andron de
Dmitriy
2
Nota: esta solução pode causar alguns problemas se você pretende usar nomes de subdomínios para outros fins. Por exemplo, app.seudominio.com será redirecionado para www.app.seudominio.com.
Marty ZHANG
1
Este é exatamente o oposto de uma resposta à pergunta.
John
Eu tive que adicionar RewriteEngine One RewriteBase /, mas funcionou bem.
Overthink
45

Se você quiser fazer isso no arquivo httpd.conf, poderá fazê-lo sem mod_rewrite (e, aparentemente, é melhor para o desempenho).

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

Eu recebi essa resposta aqui: /server/120488/redirect-url-within-apache-virtualhost/120507#120507

William Denniss
fonte
33

Aqui estão as regras para redirecionar um URL www para no-www:

#########################
# redirect www to no-www
#########################

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

Aqui estão as regras para redirecionar um URL sem www para www:

#########################
# redirect no-www to www
#########################

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

Observe que eu usei o NEsinalizador para impedir que o apache escape da string de consulta. Sem esse sinalizador, o apache alterará o URL solicitado http://www.example.com/?foo%20barparahttp://www.example.com/?foo%2250bar

Salman A
fonte
1
você pode escrever código para redirecionamento http para https juntamente com redirecionamento www para não-www
Hyder Ali
Altere http: // para https: // para forçá-lo para HTTPS quando for alterado. Você também deseja adicionar um redirecionamento http-> https normal para o tráfego que não está sendo redirecionado por essas regras.
diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

o RewriteCond captura tudo na HTTP_HOSTvariável após o www.e salva %1.

A RewriteRulecaptura do URL sem os principais/ e o salva $1.

Michael Cramer
fonte
1
sans leading "/"- Em .htaccess(como declarado na pergunta), não há avanço /, portanto o padrão nunca corresponde e o redirecionamento nunca acontece. (Existe apenas uma barra invertida em um contexto de servidor ou host virtual .) Além disso, se você tiver alguma diretiva mod_rewrite após isso, precisará do Lsinalizador.
precisa saber é o seguinte
7

Tente o seguinte:

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

Se o host começar com www, colocamos o host inteiro no início da URL e retire o "www".

Greg
fonte
1
RoBorg, infelizmente suas configurações não funcionam, se eu tentar o seguinte: example.com/hello/world Eu acabo aqui: example.com/hello/world/world Também tive que adicionar uma barra após% {HTTP_POST} no diretório Primeiro RewriteRule
deepwell 27/10/08
2
Estou usando o Apache / 2.2.9 (Unix). Funciona para www.website, que redireciona para o site. Mas, para o seguinte: website / test -> vai para: websitetest Corrigi isso adicionando outro / Segundo erro: website / test / n vai para websitetest / n / n
deepwell
1
Mesmo problema que o @deepwell com este.
Neemzy 21/10
O problema que os leitores anteriores estão enfrentando é que essas diretivas se destinam à configuração do servidor (ou vhost), não .htaccess. Em um contexto de diretório ( .htaccess), você deve alterar o primeiro RewriteRulepara ler: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](requer Apache 2.2.12+). Observe a adição da barra e o DPIsinalizador (Descartar informações do caminho) - para impedir que parte do caminho do URL seja aparentemente duplicada (que é de fato "informações do caminho"), conforme declarado nos comentários anteriores. No entanto, existem diretivas mais simples - conforme abordado nas outras respostas.
MrWhite
7

Manipulador WWW genérico completo, http / https

Não vi uma resposta completa. Eu uso isso para lidar com a inclusão na WWW.

  1. Genérico. Não requer informações de domínio.
  2. Força a WWW no domínio principal: www.domain.com
  3. Remove WWW em subdomínios: sub.domain.com
  4. Preserva o status HTTP / HTTPS.
  5. Permite cookies individuais para domínio / subdomínios

Por favor, deixe-me saber como isso funciona ou se eu deixei uma brecha.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Gregor Macgregor
fonte
A pergunta original pede para redirecionar wwwpara não- www. Você está forçando a inclusão de www.
Vadim
6

Pode haver muita desinformação sobre redirecionamentos htaccess, eu acho. Primeiro, verifique se o site está sendo executado no Unix usando o Apache e não em um host do Windows, se você espera que esse código funcione.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

Entretanto, verifique se não há espaços entre as linhas; acrescentei um espaço extra entre as linhas para que fique bem nesta janela.

Este é um trecho de código que pode ser usado para direcionar a versão www do seu site para a versão http: //. Existem outros códigos semelhantes que também podem ser usados.

Redirecionamento Htaccess
fonte
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Para subpasta

pelajar
fonte
3

Para aqueles que precisam acessar o site inteiro SEM o prefixo 'www'.

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

Mare certifique-se de adicionar isso ao seguinte arquivo

/site/location/.htaccess 
Rick
fonte
Este exemplo não está completo - você não está definindo a protosslvariável de ambiente (essa não é uma variável padrão / servidor). Sempre estará vazio, e sempre será redirecionado para http. (A idéia por trás a criação protosslno início do código é para quando você quiser preservar o protocolo ao redirecionar No entanto, estes dias você provavelmente deve ser redirecionando para. httpsO tempo todo.)
MrWhite
3

Usando .htaccess para redirecionar para www ou não www:

Basta colocar as seguintes linhas de código no seu arquivo .htaccess principal e raiz. Nos dois casos, altere domain.com para o seu próprio nome de host.

Redirecionar para www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Redirecionar para não www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

mude DOT para =>. !!!

Rohallah Hatami
fonte
2

Eu usei a regra acima para enviar www para no www e funciona bem na página inicial, no entanto, nas páginas internas eles estão encaminhando para /index.php

Encontrei essa outra regra no meu arquivo .htaccess, que está causando isso, mas não tenho certeza do que fazer a respeito. Qualquer sugestão seria ótima:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
Lucas
fonte
Você precisa colocar regras de redirecionamento que não sejam www antes das citadas.
Vladimir Jovanović
2

www para não www com https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rajith Ramachandran
fonte
2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Se você deseja remover os wwwdois httpe https, use o seguinte:

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

Isso redireciona Non ssl

para

E SSL

para

no apache, 2.4.*você pode fazer isso usando uma diretiva Redirectwith if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
fonte
2

use: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Ou .htaccess:

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

e O método PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
antimalwareprogram
fonte
1

A única maneira de fazê-lo funcionar ...

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

Se você está forçando www. em url ou forçar ssl prototcol, tente usar possíveis variações no arquivo htaccess, como:

RewriteEngine On
RewriteBase /

### Forçar WWW ###

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

## Forçar SSL ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## Bloquear IP's ###
Negar pedido, permitir
Negar de 256.251.0.139
Negar de 199.127.0.259
mística
fonte
O Apache pode escutar outra porta, por exemplo, 81. Então, em vez de RewriteCond %{SERVER_PORT} 80sugerir usar uma verificação mais universal:RewriteCond %{HTTPS} off
Andron 8/15
1

A resposta selecionada e muitas outras soluções aqui eliminaram a parte do URL depois de /, então basicamente ele sempre foi redirecionado para o domínio principal, pelo menos para mim .. Então, eu estou adicionando uma amostra de trabalho respeitando o caminho completo após a barra ..

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

Abordagem alternativa se a personalização do .htaccess não for a opção ideal:

Eu criei um servidor de redirecionamento simples para uso público. Basta adicionar um registro A ou CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Mais informações: https://simpleredirect.net

Bobík
fonte
0

Não sei por que você deseja remover www. Mas a versão reversa seria:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

E a vantagem desse script é: se você tiver algo como test.whattimein.com ou qualquer outro (ambiente para desenvolvimento / teste), ele não redirecionará U para o ambiente original.

local
fonte
2
Se o subdomínio www deve ser incluído ou não, é realmente uma questão de preferência pessoal e pode depender do nome do domínio e do público-alvo. O código genérico postado acima para redirecionar www para none-www também lida com os ambientes de teste, pois o redirecionamento ocorre apenas quando o "www". subdomínio encontrado.
precisa saber é o seguinte
1
Esta pergunta faz o oposto do que o usuário está perguntando, o que está poluindo apenas a postagem.
Vadim
0

Isso é atualizado para funcionar no Apache 2.4:

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

A única alteração em relação à de Michael é remover o [NC], que produz o erro "AH00665":

A opção NoCase para o padrão não regex '-f' não é suportada e será ignorada

William Entriken
fonte
A resposta anterior não precisava de "atualização para funcionar no Apache 2.4". O "aviso" que você está citando (AH00665) se refere a uma diretiva diferente (por exemplo, se você tiver algo parecido RewriteCond %{REQUEST_FILENAME} !-f [NC]). O NCsinalizador faz pouca diferença no item acima, no entanto, o motivo pelo qual o NCsinalizador deve ser usado aqui é capturar a pequena fração do tráfego de bot que (incorretamente) envia um nome de host em maiúsculas.
precisa saber é o seguinte
0

Adicionado se localhost, ignore o redirecionamento (para fins de desenvolvimento no ambiente local). Se não for host local AND (não é https OU é www), redirecione para https e não www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Jeaf Gilbert
fonte
Elabore seu código para que o OP entenda como isso responde à pergunta.
22919 RyanNerd
-2

Oi, você pode usar as seguintes regras no seu arquivo htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
fonte
A questão é pedir uma solução "genérica" ​​que não inclua o nome de domínio. Sua solução também faz o oposto completo do que é solicitado na pergunta (não www para www, em vez de www para não www) sem explicação.
MrWhite 20/01/19