redirigir apache de no www a www

206

Tengo un sitio web que no parece redirigir de no www a www.

Mi configuración de Apache es la siguiente:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

¿Qué me estoy perdiendo?

usuario121196
fuente
1
Para una .htaccesssolución basada, sugiero una respuesta que se ha planteado en la pregunta diametral: stackoverflow.com/a/5262044/367456
hakre
esto es bueno, sin embargo, agrega una barra a la URL, así que pierde la barra antes del dólar.
wuxmedia
Posible duplicado de htaccess genérico redirige www a no www
Bobík

Respuestas:

510

Usar el motor de reescritura es una forma bastante pesada de resolver este problema. Aquí hay una solución más simple:

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

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Y luego tendrá otra <VirtualHost>sección con ServerName www.example.comsu configuración de servidor real. Apache conserva automáticamente cualquier cosa después del /uso de la Redirectdirectiva , que es un error común sobre por qué este método no funcionará (cuando en realidad lo hace).

Greg Hewgill
fuente
20
¿Cómo lo hace para un sitio que también tiene un host virtual SSL?
Shabbyrobe
28
Recibo el error "La página web en example.com ha resultado en demasiados redireccionamientos" cuando uso esta sugerencia. ¿Otros tienen este problema?
Jonathan Berger
44
@BlackDivine: No hay nada mágico en hacerlo en la otra dirección. Simplemente intercambie www.exampley exampledonde sea que aparezcan en la muestra.
Greg Hewgill
11
@ JonathanBerger Si tiene demasiados redireccionamientos, probablemente no haya configurado bien el archivo. Asegúrese de tener 2 VirtualHosts: uno con no www que es el anterior y el otro con ServerName www.example.com que tiene la configuración real. También asegúrese de no tener una redirección en la configuración de www.example.com (tanto mod_alias como mod_rewrite).
Savas Vedova
3
Para un servidor host virtual, por ejemplo, example.com, tengo Redirect 301 / http://example2.com/extra/pero cuando se redirige, se pierde la barra diagonal, lo que significa que example.com/blahva a example2.com/extrablah. ¿Algunas ideas? (Apache 2.2.22)
Peter Howe
88

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]
burzumko
fuente
3
respuesta muy corta ... pero a los puntos ... no estoy seguro si este es un voto
positivo
2
¡Oh, eso está bien, esto se puede incluir en la configuración del servidor en el nivel superior (y si es así) se aplicará a cada host virtual!
thenickdude
Hola @burzumko, ¿cómo logras esto, lo cual es cierto para todos sin www, pero luego, deja example.com/subdi1/ws/* pasar sin www?
sensei negro
1
También utilicé esta solución para hosts virtuales HTTPS. Simplemente agregue un sa http en la tercera fila.
rodrigoap
46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
cherouvim
fuente
Esto no funcionó para mí; causó un bucle de redireccionamiento infinito al mismo sitio
dmiller309
1
@ dmiller309: ¿Te has incluido www.en el ServerAlias?
cherouvim
2
Tienes razón, accidentalmente puse www. en el ServerAlias ​​usando el *. comodín. Porque estropeé el orden de las entradas de VirtualHost, el *. comodín tuvo la oportunidad de coincidir cuando no pensé que lo haría.
dmiller309
77
Esta es la mejor respuesta, porque es limpia, mantiene el camino (a diferencia de la respuesta # 1) y no usa Reescribir.
schieferstapel
30

Para eliminar wwwde su URLsitio web, use este código en su .htaccessarchivo:

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

Para forzar wwwen su sitio web, URLuse este código en.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]

Donde YourSite.comdebe ser reemplazado con su URL.

kloddant
fuente
La mejor respuesta aquí, ya que funciona para sitios web con múltiples nombres de dominio <3
Clement Herreman
2
¿Para qué es la segunda parte con el .html?
Nathan H
66
Elimine la barra inclinada antes de $ 1 para no tener doble barra inclinada (//) después de redireccionar => 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>

Esto es lo que sucede con el código anterior. El primer bloque de host virtual comprueba si la solicitud es www.example.com y ejecuta su sitio web en ese directorio.

En su defecto, se trata de la segunda sección de host virtual. Aquí, todo lo que no sea www.example.com se redirige a www.example.com.

El orden aquí importa. Si agrega la segunda directiva virtualhost primero, provocará un bucle de redireccionamiento.

Esta solución redirigirá cualquier solicitud a su dominio, a www.yourdomain.com.

¡Salud!

Dishan Philips
fuente
16

Esto es similar a muchas de las otras sugerencias con un par de mejoras:

  • No es necesario codificar el dominio (funciona con vhosts que aceptan múltiples dominios o entre entornos)
  • Conserva el esquema (http / https) e ignora los efectos de las %{REQUEST_URI}reglas anteriores .
  • La porción de ruta no afectada por RewriteRules anteriores %{REQUEST_URI}es.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
weotch
fuente
44
Casi perfecto. Debe ser% {HTTP_HOST} $ 1, no% {HTTP_HOST} / $ 1 (o duplicará la barra)
Michael Wyraz
@Michael Wyraz: ¡¿No duplica el corte aquí ?!
not2savvy
10
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Esto comienza con la HTTP_HOSTvariable, que contiene solo la parte del nombre de dominio de la URL entrante ( example.com). Suponiendo que el nombre de dominio no contiene www.ay coincide exactamente con su nombre de dominio, entonces entra en juego RewriteRule. El patrón ^(.*)$coincidirá con todo en el REQUEST_URI, que es el recurso solicitado en la solicitud HTTP ( foo/blah/index.html). Almacena esto en una referencia inversa, que luego se utiliza para reescribir la URL con el nuevo nombre de dominio (uno que comienza con www).

[NC]indica una coincidencia de patrones que no distingue entre mayúsculas y minúsculas, [R=301]indica una redirección externa usando el código 301 (recurso movido permanentemente), y [L]detiene toda reescritura adicional y redirige inmediatamente.

Tasker Curtis
fuente
6

Código de redireccionamiento para ambos no www => www y opuesto www => no www. No hay dominios y esquemas de codificación en el archivo .htaccess. Por lo tanto, el dominio de origen y la versión http / https se conservarán.

APACHE 2.4 Y MÁS NUEVOS

NO WWW => WWW:

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

WWW => NO WWW:

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

Nota: no funciona en Apache 2.2 donde% {REQUEST_SCHEME} no está disponible. Para compatibilidad con Apache 2.2, use el código a continuación o reemplace% {REQUEST_SCHEME} con http / https fijo.


APACHE 2.2 Y MÁS NUEVOS

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

... o una versión más corta ...

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 => NO 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]

... la versión más corta no es posible porque% N está disponible solo desde el último RewriteCond ...

mikep
fuente
La configuración de Apache 2.4 solucionó el problema, gracias por la respuesta limpia .. !!
KimchiMan
5

Corrí esto ...

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

Necesito que esto sea universal para más de 25 dominios en nuestro nuevo servidor, por lo que esta directiva está en mi archivo virtual.conf en una etiqueta <Directory>. (dir es padre para todos los docroots)

Sin embargo, tuve que hacer un poco de pirateo en la regla de reescritura, ya que el docroot completo se estaba llevando a cabo en la coincidencia de patrones, a pesar de lo que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dice sobre que solo son cosas después del host y el puerto.

Andrew Deal
fuente
5

Si está utilizando Apache 2.4, sin la necesidad de habilitar el módulo de reescritura de apache, puede usar algo como esto:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
sys0dm1n
fuente
1
Respuesta infravalorada. Con esto, se pueden evitar vhosts adicionales, lo cual es bueno para los scripts de Let'sEncrypt automatizados.
Paul
Además, si está utilizando ANSIBLE, desde ANSIBLE 2.0 ahora puede insertar fácilmente un bloque en un archivo en una tarea, más detalles aquí docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n
3

Redirigir domain.tld a www.

Las siguientes líneas se pueden agregar en las directivas de Apache o en el archivo .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Otros dominios siguen funcionando.
  • No es necesario ajustar las líneas. simplemente cópielos / péguelos en el lugar correcto.

No olvide aplicar los cambios de apache si modifica el vhost.

(basado en el Drupal7 predeterminado .htaccess pero debería funcionar en muchos casos)

xaa
fuente
3

¡Esto es simple!

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
kk4You
fuente
2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Esto redirigirá no solo el nombre de dominio sino también las 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

Aneesh RS
fuente
Gracias por esto. Muy útil.
Anthony
2

Prueba esto:

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

No lo use siempre Redirect permanent(o por qué puede causar problemas en el futuro)

Si existe la posibilidad de que agregue subdominios más tarde, no lo use redirect permanent.

Porque si un cliente ha usado un subdominio que no se registró VirtualHost, también puede que nunca llegue a este subdominio, incluso cuando se registre más tarde.

redirect permanentenvía un mensaje HTTP 301 Moved Permanentlyal cliente (navegador) y muchos de ellos almacenan en caché esta respuesta para siempre (hasta que el caché se borra [manualmente]). Por lo tanto, el uso de ese subdominio siempre se redirigirá automáticamente a www. *** sin volver a solicitar el servidor.

ver ¿Por cuánto tiempo los navegadores almacenan en caché los HTTP 301?

Así que solo usa Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Cuándo no usar mod_rewrite

Apache.org - Nombres de host canónicos

Martin Schneider
fuente
1

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

mira este trabajo perfecto

Tejinder singh
fuente
1

-Si aloja varios nombres de dominio (Opcional)

-Si todos esos nombres de dominio están usando https (como deberían)

-si desea que todos esos nombres de dominio usen www dot domainName

Esto evitará la doble redirección (http: // non www a http: // www y luego a https: // www)

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

Y

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

Debe cambiar el código de redireccionamiento 301 al más conveniente

YOGO
fuente
0

Solo tengo el mismo problema. Pero resuelto con esto

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

Esta regla redirige no www a www.

Y esta regla para redirigir www a no www

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

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

Santo Doni Romadhoni
fuente
0

Esto funciona para mi:

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

Utilizo el patrón de anticipación (?!www.domain.com)para excluir el wwwsubdominio al redirigir todos los dominios al wwwsubdominio para evitar un bucle de redireccionamiento infinito en Apache.

Mauricio Sánchez
fuente
0

El código que uso es:

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

Si usa la solución anterior de dos <VirtualHost *:80>bloques con diferentes ServerNames ...

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

... entonces debes configurar NameVirtualHost Ontambién .

Si no hace esto, Apache no se permite usar los diferentes ServerNames para distinguir los bloques, por lo que recibe este mensaje de error:

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

... y no ocurre la redirección, o tiene un bucle de redirección infinito, dependiendo del bloque que coloque primero.

Stuart Caie
fuente
-1

Tuve una tarea similar en un WP Multisite, donde la regla de redireccionamiento tenía que ser genérica (para cualquier dominio que agregaría a la red). Primero resolví agregar un comodín al dominio (dominio estacionado). Nota la . después de .com.

CNAME * domain.com.

Y luego agregué las siguientes líneas al archivo .htaccess en la raíz de mi multisitio. Supongo que funcionaría para cualquier sitio.

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

Esperemos que esto ayude.

PD. Si desea redirigir de no www a www, cambie la última línea a

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

Me resultó más fácil (y más útil) usar ServerAlias ​​cuando se usan múltiples vhosts.

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

Esto también funciona con https vhosts.

Fabian76
fuente
Otro voto negativo en coche. Cuídate de explicar, oh dios poderoso de httpd, ¿quién no podría molestarse en explicar el voto negativo?
Anthony
1
Esto hace que tenga múltiples dominios que alojan el mismo sitio. Dependiendo de su situación y de lo que esté ejecutando su servidor web subyacente, tendrá problemas con las cookies que no se transfieren, las personas confusas y los problemas del motor de búsqueda (que verá esto como 2 sitios diferentes).
Jeffrey Van Alstine