www specific sitio setup rewritecond redireccionar puerto personalizar pages page not non htaccess found force forbidden example error conf con another apache redirect mod-rewrite no-www

specific - redirección apache de no www a www



rewritecond non www (21)

Tengo un sitio web que no parece redireccionar 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?


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 sudomains todavía están trabajando.
  • No es necesario ajustar las líneas. solo copie / pegue en el lugar correcto.

No olvides aplicar los cambios de apache si modificas el vhost.

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


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

APACHE 2.4 Y MÁS NUEVO

NON-WWW => WWW:

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

WWW => NON-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 siguiente código o reemplace% {REQUEST_SCHEME} con http / https fijo.

APACHE 2.2 Y MÁS NUEVO

NON-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 => NON-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 la última RewriteCond ...


Ejecuté 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 se encuentra en mi archivo virtual.conf en una etiqueta <Directory>. (dir es el padre de todos los docroots)

Sin embargo, tuve que hacer un poco de truco 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 dice http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html sobre eso solo siendo cosas después del host y el puerto.


Encontré que era más fácil (y más útil) usar ServerAlias ​​al usar múltiples vhosts.

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

Esto también funciona con https vhosts.


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

  • No es necesario codificar el dominio de forma rígida (funciona con vhosts que aceptan dominios múltiples o entre entornos)
  • Conserva el esquema (http / https) e ignora los efectos de las reglas anteriores de %{REQUEST_URI} .
  • La parte de ruta no afectada por RewriteRule anterior como %{REQUEST_URI} es.

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


Esto funciona para mí:

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

Utilizo el patrón de búsqueda anticipada (?!www.domain.com) para excluir el subdominio www al redirigir todos los dominios al subdominio www para evitar un bucle infinito de redirección en Apache.


Para eliminar www del sitio web de su URL , use este código en su archivo .htaccess :

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

Para forzar a www en la URL su sitio web, use 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.com debe ser reemplazado con su URL .


Prueba esto:

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


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>


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

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

... luego debes configurar NameVirtualHost On también .

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

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

... y o bien no se produce una redirección, o bien se tiene un bucle de redirección infinito, dependiendo del bloque que se coloque primero.


Solo tengo un problema. Pero resuelto con esto

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

Esta regla redirecciona 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/


Tenía una tarea similar en un WP Multisite, donde la regla de redirección tenía que ser genérica (para cualquier dominio dado que agregaría a la red). Resolví primero 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 sitio múltiple. Supongo que funcionaría para cualquier sitio.

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

Espero que esto ayude.

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

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


Usar el motor de reescritura es una forma bastante pesada para 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 sección <VirtualHost> con ServerName www.example.com para la configuración real de su servidor. Apache automáticamente conserva cualquier cosa después de / cuando se usa la directiva Redirect , que es un error común sobre por qué este método no funcionará (cuando de hecho lo hace).


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

revisa este trabajo perfecto


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]


El código que uso es:

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


No siempre use Redirect permanent (o por qué puede causar problemas)

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

Porque si un cliente ha usado un subdominio que no fue registrado como VirtualHost es posible que nunca llegue a este subdominio incluso cuando se registre más tarde.

redirect permanent envía un HTTP 301 Moved Permanently al cliente (navegador) y muchos de ellos almacenan en caché esta respuesta para siempre (hasta que el caché se borre [manualmente]). Así que usar ese subdominio siempre se redireccionará automáticamente a www. *** sin solicitar el servidor nuevamente.

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

Entonces 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


<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, llega a la segunda sección de host virtual. Aquí cualquier cosa que no sea www.example.com se redirige a www.example.com.

El orden aquí importa. Si agrega la segunda directiva de virtualhost primero, causará un bucle de redirección.

Esta solución redireccionará cualquier solicitud a su dominio, a www.sudominio.com.

¡Aclamaciones!


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


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

Esto redireccionará no solo el nombre de dominio sino también las páginas internas.

example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh


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

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

[NC] indica coincidencia de patrón insensible a mayúsculas y minúsculas, [R=301] indica un redireccionamiento externo usando el código 301 (recurso movido permanentemente), y [L] detiene toda reescritura adicional, y redirige inmediatamente.