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?


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

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


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]

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>

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.


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!


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]
    

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.


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


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.


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>

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)


3

¡Esto es simple!

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

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


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]

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


1

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

mira este trabajo perfecto


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



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.


0

El código que uso es:

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

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


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

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.