.htaccess: cómo forzar "www." de forma genérica?

102

Esto cambiará domain.coma www.domain.com:

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

¿Cómo reemplazo la parte "dominio" para que funcione en cualquier dominio?

StackOverflowNewbie
fuente

Respuestas:

249

Usaría esta regla:

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]

La primera condición comprueba si el valor del Host no está vacío (en el caso de HTTP / 1.0); el segundo comprueba si el valor del Host no comienza con www.; los terceros cheques para HTTPS ( %{HTTPS}es o bien ono off, por lo %{HTTPS}ses, ya sea onso offsy en caso de onsla sadaptada). La parte de sustitución de RewriteRuleluego simplemente fusiona las partes de información en una URL completa.

Gumbo
fuente
31
Esta solución solo funciona si desea que todos los subdominios se reenvíen a www.yourdomain.com. Si solo desea forzar www, debe actualizar la segunda línea para que sea:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky
2
No obtengo ninguno de mis subdominios reenviado a www.mydomain.com usando la regla publicada en la pregunta ...
lol
3
¡muy inteligente! Me gusta que forzó la verificación HTTPS para devolver una "S" en el grupo de captura, que utilizó en la siguiente línea. muy elegante
code_monk
Parece una respuesta universal, cubre HTTP y protocolos normales, funciona como un encanto.
Clain Dsilva
1
¡Gracias! Agregaría RewriteEngine Oncomo la primera línea para completarlo, ya que esto podría conducir a un error de servidor 500 si se copia y pega como está.
Ryan Casas
44

Esto lo hará:

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

Si desea redirigir todas las solicitudes que no sean de www a su sitio a la versión www, todo lo que necesita hacer es agregar el siguiente código a su archivo .htaccess:

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

Esto no funcionará con subdominios.

domain.com se redirige correctamente a www.domain.com

pero

images.domain.com se redirige a www.images.domain.com

En lugar de comprobar si el subdominio "no es www", compruebe si hay dos puntos:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
john mccarthy
fuente
Me gusta esta solucion De todos modos, ¿lograr lo mismo con TLD como .co.uk?
TylersSN
1
@iUseMagentoNow simplemente aumente los puntos, por ejemplo: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Estrictamente hablando, su TLD está quieto .uky su dominio lo está something.co)
mirabilos
.co en este caso es un dominio de segundo nivel y en realidad no es parte de su dominio, donde como .uk es un TLD de código de país. Para ser honesto, habiendo trabajado en la industria del alojamiento y viendo los nuevos formatos para los nombres de dominio, no veo que los formatos TLD actuales duren para otros usos que no sean los oficiales. gobiernos, organizaciones, etc. En un futuro cercano, cuando pueda registrar fqdn como fred.bloggs por un precio similar al de las normas actuales, la web personal se verá muy diferente desde el punto de vista del DNS.
Chris
1

Lo siguiente debe anteponer 'www' a cualquier solicitud que no tenga uno y redirigir la solicitud editada al nuevo URI.

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

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

Esto redirige example.coma www.example.comexcluir subdominios.

Amit Verma
fuente
Para mí, esto parece ser el envío de www.example.com a www.www.example.com jaja
Albert Renshaw
@Albert Quizás esto se deba a la memoria caché de su navegador. Limpia tu caché y vuelve a intentarlo.
Amit Verma
¡Estás en lo correcto! Acabo de ejecutar en incógnito (Chrome) y funcionó bien, ¡gracias!
Albert Renshaw
1
Me gusta mucho esta regla genérica. Pero doesn `t trabajo para domain.co.uk ya que ya tiene dos puntos en el mismo. ¿Cómo podría cambiarse esta regla para que funcione también para .co.uk?
Sacha Vorbeck
1
Para .co.uk y otros subcctlds esto funciona: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Pero desafortunadamente hay algunos tlds escritos ( wiki.mozilla.org/TLD_List ) como es que permiten dominio.es así como dominio.com.es. Agregar | es a la expresión regular coincidiría con domain.es así como con www.domain.es, que no se desea aquí. Tengo que encontrar una manera de manejar estos sub-cctld de tipos mixtos
Sacha Vorbeck
-1

esto funcionó como magia para mí

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

SamYah
fuente