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