Pergunta

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

configuração Meu Apache é o 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 eu estou ausente?

Foi útil?

Solução

Usando o mecanismo de reescrita é uma maneira muito pesado para resolver este 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ê vai ter outra seção <VirtualHost> com ServerName www.example.com para o seu servidor real configuração. Apache preserva automaticamente qualquer coisa após a / ao usar o Redirect directiva , que é um equívoco comum sobre o porquê de este método não vai funcionar (quando na verdade ele faz).

Outras dicas

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]
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Para remover www da sua utilização website URL este código em seu arquivo .htaccess:

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

Para forçar www em seu uso URL website 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.com deve ser substituído com seu URL.

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

Este é o que acontece com o código acima. Os primeiros cheques de bloco de host virtual, se o pedido for www.example.com e corre o seu site no diretório.

caso contrário, se trata da segunda seção host virtual. Aqui outra coisa senão www.example.com é redirecionado para www.example.com.

A ordem aqui importa. Se você adicionar a segunda directiva virtualhost primeiro, ele irá causar um loop de redirecionamento.

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

Felicidades!

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

  • Não há necessidade de codificar o domínio (obras com vhosts que aceitam vários domínios ou entre ambientes)
  • Preserva o esquema (http / https) e ignora os efeitos das regras %{REQUEST_URI} anteriores.
  • A parte de percurso não foi afectada por RewriteRules anteriores, como é %{REQUEST_URI}.

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

Isso começa com a variável HTTP_HOST, que contém apenas a parte do nome de domínio do URL de entrada (example.com). Supondo que o nome de domínio não contém um www. e corresponde ao seu nome de domínio exatamente, então o RewriteRule entra em jogo. O ^(.*)$ padrão irá corresponder tudo no REQUEST_URI, que é o recurso solicitado no pedido HTTP (foo/blah/index.html). Ele armazena isso em uma referência para trás, que é então utilizado para reescrever o URL com o novo nome de domínio (que começa com www).

[NC] indica a correspondência de padrão de maiúsculas e minúsculas, [R=301] indica um redirecionamento externo usando o código 301 (recurso movido permanentemente) e [L] pára tudo mais reescrita, e redirecionamentos imediatamente.

Eu corri este ...

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

Eu preciso que isso seja universal para 25+ domínios em nosso novo servidor, portanto, esta directiva é no meu arquivo virtual.conf em uma tag . (Dir é pai para todos os docroots)

Eu tive que fazer um pouco de um corte na regra de reescrita, porém, como o docroot cheia estava sendo realizado no jogo padrão, apesar do que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html diz sobre isso sendo apenas coisas depois o host ea porta.

código

Redirecionamento tanto para não-www => www e www oposto => não-www. Sem hardcoding domínios e esquemas no arquivo .htaccess. Então domínio origem e http / https versão será preservada.

APACHE 2.4 e mais recentes

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 funciona no Apache 2.2, onde% {REQUEST_SCHEME} não está disponível. Para compatibilidade com Apache código 2.2 Utilização abaixo ou substituir% {REQUEST_SCHEME} com fixo http / https.


Apache 2.2 e mais recentes

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]

... mais curto versão não é possível porque% N está disponível apenas a partir de última RewriteCond ...

Se você estiver usando Apache 2.4, sem a necessidade de permitir a reescrever apache módulo que você pode usar algo como isto:

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

Redirect domain.tld para www.

As seguintes linhas podem ser adicionados tanto em diretivas do 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]
  • Outras sudomains ainda estão trabalhando.
  • Não há necessidade de ajustar as linhas. basta copiar / colar-los no lugar certo.

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

(baseado no padrão Drupal7 .htaccess mas deve funcionar em muitos casos)

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

Isto irá redirecionar não só o nome de domínio, mas também o interior pages.like ...
example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

Tente isto:

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

Esta é simples!

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

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

verificar este trabalho perfeito

NÃO hair uso Redirect permanent (ou porque ele pode causar problemas)

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

Porque se um cliente tiver usado um subdomínio que não foi registado como VirtualHost ele pode também nunca chegar a este subdomínio mesmo quando é registado mais tarde.

redirect permanent envia um HTTP 301 Moved Permanently para o cliente (browser) e um monte deles armazenar em cache esta resposta para sempre (até que o cache é apagada [manualmente]). Então, usando esse subdomínio será sempre autoredirect para www. *** sem pedir o servidor novamente.

Quanto tempo navegadores armazenar em cache 301s HTTP?

Então, basta usar Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Quando não usar mod_rewrite

Apache.org - Canonical Hostnames

Acabei de ter um mesmo problema. Mas resolvido com este

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

Esta regra redirecionar não-www para www.

E esta regra para redirecionar www para não-www

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

Consulte a partir http: / /dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

Isso funciona para mim:

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

Eu uso o (?!www.domain.com) padrão de olhar em frente para excluir o subdomínio www ao redirecionar todos os domínios para o subdomínio www, a fim de evitar um loop de redirecionamento infinito em Apache.

O uso de código I é:

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

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

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

... então você set must NameVirtualHost On bem .

Se você não fizer isso, Apache não se deixa usar os diferentes ServerNames para distinguir os blocos, de modo a obter esta mensagem de erro:

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

... e quer nenhum redirecionamento acontece, ou você tem um loop de redirecionamento infinito, dependendo do que bloquear você colocar em primeiro lugar.

Eu tinha uma tarefa semelhante em um WP Multisite, onde a regra de redirecionamento teve que ser genérico (para um determinado domínio eu adicionar à rede). Eu resolvi primeiro adicionando um curinga para o domínio (domínio estacionado). Note o . depois de .com.

CNAME * domain.com.

E então eu adicionei as seguintes linhas ao arquivo .htaccess na raiz do meu multisite. Eu acho que ele iria trabalhar para qualquer site.

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

Esperamos que isso vai ajudar.

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

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

Eu achei mais fácil (e mais útil) para usar ServerAlias ??ao usar vários vhosts.

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

Isto também funciona com https vhosts.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top