Redirigir no www a www en .htaccess

189

Tengo esto en mi archivo .htaccess:

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

pero cada vez que accedo a un archivo en mi raíz http://example.com/robots.txt, se redirigirá a él http://www.example.comrobots.txt/.

¿Cómo puedo corregir esto para que se redirija correctamente http://www.example.com/robots.txt?

Paul Sanchez
fuente

Respuestas:

391

Cambie su configuración a esto (agregue una barra inclinada):

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

O la solución descrita a continuación (propuesta por @absiddiqueLive ) funcionará para cualquier dominio:

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

Si necesita admitir http y https y preservar la elección del protocolo, intente lo siguiente:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Dónde reemplazar logincon checkout.phpo cualquier URL que necesite para admitir HTTPS.

Sin embargo, diría que es una mala idea. Para el razonamiento , lea esta respuesta .

Randall Hunt
fuente
Esta solución no funciona cuando algunas páginas (como iniciar sesión o registrarse) usan el protocolo https.
Alexey Kosov
He actualizado un poco la publicación para incluir información. Es difícil elegir de forma genérica y correcta el protocolo a utilizar.
Randall Hunt
3
La primera solución no redirige lo suficiente, la segunda parece redirigir demasiado. Por ejemplo blog.example.comse hacewww.blog.example.com
gman
¿Podría agregar también cómo evitar la redirección mientras se desarrolla en localhost?
Bugs Bunny
He estado siguiendo todo aquí pero nada funciona. Estoy usando una configuración laravel. ¿Alguien tiene alguna idea de por qué esto no funciona para mí? www.dominio.com y dominio.com se cargan correctamente, pero dominio.com no redirige a www.dominio.com. ¿Podría ser esto un problema con mi DNS?
Hola mundo
93

Aquí está la solución correcta que admite https y http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Alexey Kosov
fuente
77
Esto es perfecto, tampoco redirige los subdominios wwwcomo las otras soluciones genéricas.
Fabian Schmengler
44
Esta es una mejor solución, funciona mucho mejor que la respuesta aceptada, y se encarga de HTTPS correctamente
Tamik Soziev
3
¡Funciona perfectamente! ¡Y en tan pocas líneas!
zeckdude
8
ESTA ES LA MEJOR RESPUESTA
Andrew
8
Si no me equivoco, esto no funcionaría para más de un punto. Ejemplos:yoursite.co.uk
TrashyMcTrash
83
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Para Https

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddiqueLive
fuente
8
Se prefiere esta solución a @ ranman, ya que funcionará para todos los dominios, minimizando así el error humano, ya sea cuando implemente código para un nuevo proyecto o cuando implemente dominios adicionales en un proyecto existente.
Frankie
Prefiero esta solución, pero ¿por qué en ^(.*)$lugar de (.*)?
Popnoodles
esta solución es mejor, pero también he editado la mía para contener la tuya.
Randall Hunt
1
¡Esto funciona para todos los dominios, es simple y efectivo! Gracias
eirenaios
puede seguir RewriteCond% {HTTPS} s ^ on (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive
24

El siguiente ejemplo funciona en ssl y no ssl y es mucho más rápido, ya que utiliza solo una regla para administrar http y https

RewriteEngine on


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

[Probado]

Esto redirigirá

http

a

https

a

Amit Verma
fuente
1
Muy cerca de lo que se me ocurrió. También admite más de un punto en el host HTTP, por ejemplo, "mysite.co.uk".
Adambean
2
Solo por curiosidad, ¿por qué no estás usando R = 301 aquí? Utilizará 302 (temp. Movida) de forma predeterminada si no se especifica ningún código.
Marc
1
Funciona perfectamente. Esta debería ser la respuesta aceptada.
James Nisbet
8

Prueba esto, lo usé en muchos sitios web, funciona perfectamente

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
fuente
4

He probado todas las soluciones anteriores pero no funciona para mí, he intentado eliminar http: // y no redirigir, también eliminé www, redirige bien, así que me confundo, especialmente estoy ejecutando todos mis sitios en https : //

Así que combiné algunos códigos y obtuve una solución perfecta para http: // y https: // y www y non-www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Espero que esto pueda ayudar a alguién :)

Juegos Mizo
fuente
3

Esta configuración funcionó para mí en bitnami wordpress con SSL configurado:

Se agregó lo siguiente en "RewriteEngine On" en el archivo /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
fuente
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

Esto redirigirá su dominio que no se inició con WWW. No redirigirá todo su subdominio.

Es útil.

Ashish Gondaliya
fuente
2

Creo que la respuesta principal redirige con éxito el no www a www (ej: mysite.com -> www.mysite.com ), pero no tiene en cuenta los subdominios comodín, lo que resulta en:

random.mysite.com -> www.random.mysite.com

Aquí hay una solución con / sin HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* nota: no he probado https porque actualmente no tengo un certificado para probar, pero si alguien puede verificar u optimizar lo que tengo, sería increíble.

Hunter Frazier
fuente
¿Qué hace el primer $ aquí: '^ (. *) $'
Vaishal Patel
0

Si es posible, agregue esto al archivo de configuración principal de Apache. Es una solución más ligera, requiere menos procesamiento.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Por lo tanto, la VirtualHostsección separada de "example.com" captura esas solicitudes y luego las redirige permanentemente a su página principal VirtualHost. Por lo tanto, no hay análisis REGEX con cada solicitud, y los navegadores de sus clientes almacenarán en caché la redirección para que nunca (o rara vez) soliciten nuevamente la URL "incorrecta", lo que le ahorrará carga en el servidor.

Tenga en cuenta, la barra inclinada final Redirect permanent / http://www.example.com/. Sin él, una redirección desde example.com/asdfredirigiría a en http://www.example.comasdflugar de http://www.example.com/asdf.

Buttle Butkus
fuente
0

Dos advertencias

Evite 301 y prefiera los códigos de estado de respuesta modernos 303 o 307.

Evita 301

Piense detenidamente si realmente necesita la redirección permanente indicada [R=301]porque si decide cambiarla más tarde, los visitantes anteriores de la página continuarán viendo la página de la redirección original.

La información de redireccionamiento permanente se almacena frecuentemente en la memoria caché del navegador y, en general, es difícil de eliminar (volver a cargar la página no resuelve el problema). Los visitantes de su sitio web quedarán atrapados en la redirección anterior "para siempre".

Evita 302 también

La nueva versión del protocolo HTTP (v1.1) agregó dos nuevos códigos de estado de respuesta que se pueden usar en lugar de 302.

  • 303 Redirección de URL, pero exige cambiar el tipo de solicitud a GET.
  • 307 Redirección de URL, pero exige mantener el tipo de solicitud tal como se envió inicialmente.

Todavía puede usar el código 302(redirección no permanente) aunque se considera ambiguo. En cualquier caso, la mayoría de los navegadores implementan 302de la misma manera que el nuevo 303código indica.

ePi272314
fuente
con respecto a su advertencia sobre 301, esto se aplicará incluso si estamos hablando del mismo nombre de dominio? no estoy tan seguro de cómo se aplicará esto en este caso ... redirigiendo todas las URL de http://example.com/testinga http://www.example.com/testing. ¿Podría ser un mal enfoque a largo plazo? Gracias,
Sara_
-1

Escribe en .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
fuente
1
Igual que otras respuestas
Ankit