Pregunta

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

¿Fue útil?

Solución

Utilizando el motor de reescritura es una manera bastante pesado para resolver este problema. Aquí es 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 entonces usted tiene otra sección <VirtualHost> con ServerName www.example.com para su servidor real configuración. Apache conserva automáticamente nada después de la / cuando se utiliza el Redirect Directiva , que es un error común acerca de por qué este método no funcionará (cuando de hecho lo hace).

Otros consejos

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]
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Para eliminar www desde su sitio web URL utilizar este código en su archivo .htaccess:

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

Para forzar www en su sitio web el uso URL 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]

Cuando YourSite.com debe ser reemplazado con su URL.

    <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 de seguridad. Los primeros cheques de bloques de host virtuales si la solicitud es www.example.com y se ejecuta su sitio web en ese directorio.

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

El orden aquí importa. Si se agrega la segunda directiva VirtualHost en primer lugar, que causará un bucle de redireccionamiento.

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

Saludos!

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

  • No hay necesidad de codificar el dominio (trabaja con vhosts que aceptan varios dominios o entre entornos)
  • Conserva el esquema (HTTP / HTTPS) e ignora los efectos de las reglas %{REQUEST_URI} anteriores.
  • La parte de trayectoria no afectada por RewriteRules anteriores como %{REQUEST_URI} es.

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

Esto comienza con la variable HTTP_HOST, que contiene sólo la parte de 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 con exactitud, entonces el RewriteRule entra en juego. El ^(.*)$ patrón coincidirá con todo en el REQUEST_URI, que es el recurso solicitado en la petición HTTP (foo/blah/index.html). Almacena esto en una referencia hacia atrás, que luego se utiliza para volver a escribir la dirección URL con el nuevo nombre de dominio (que comienza con www).

[NC] indica mayúsculas y minúsculas coincidencia de patrones, [R=301] indica una redirección externa utilizando el código 301 (recurso trasladó permanentemente), y [L] detiene todo reescritura más, y redirige inmediatamente.

Me encontré con 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 es en mi archivo virtual.conf en una etiqueta . (Dir es el padre de todos los docroots)

que tenía que hacer un poco de un truco en la regla de reescritura, aunque, como la raíz de documento completo se llevaba a través de la comparación de patrones, a pesar de lo http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dice acerca de que sólo siendo cosas después de que el host y el puerto.

código de redirección tanto para no www => www y www opuesta => no www. No hay dominios hardcoding y esquemas en el archivo .htaccess. Así dominio de origen y HTTP / HTTPS versión será preservado.

APACHE 2.4 y más reciente

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 la compatibilidad con Apache código 2.2 uso por debajo o reemplazar% {REQUEST_SCHEME} con fijo HTTP / HTTPS.


APACHE 2.2 y más reciente

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

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

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

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

Redirigir domain.tld a www.

Las siguientes líneas se pueden añadir ya sea 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 hay necesidad de ajustar las líneas. simplemente copiar / pegar ellos en el lugar correcto.

No se olvide de aplicar los cambios apache si modifica el host virtual.

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

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

Esto redirigirá no sólo el nombre de dominio, sino también el interior  pages.like ...
 example.com/abcd.html ==> www.example.com/abcd.html
example.com/ab/cd.html?ef=gh ==> www.example.com/ab/cd.html?ef=gh

Prueba esto:

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

Esto es simple!

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

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

mira este trabajo perfecto

No utilice Allways Redirect permanent (o por lo que puede causar problemas)

Si hay una posibilidad de que se añada subdominios más tarde, no use redirect permanent.

Porque si un cliente ha utilizado un subdominio que no estaba registrada como VirtualHost que también puede nunca llegan a este subdominio incluso cuando es registrada después.

redirect permanent envía un HTTP 301 Moved Permanently al cliente (navegador) y una gran cantidad de ellos en caché esta respuesta para siempre (hasta que se borre la memoria caché [manual]). Así, utilizando ese subdominio siempre autoredirect a www. *** sin solicitar de nuevo el servidor.

Vea ¿Cuánto tiempo caché de los navegadores 301s HTTP?

Entonces sólo tiene que utilizar Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org - Cuando no usar mod_rewrite

Apache.org - Los nombres de host canónicas

He simplemente una mismo problema. Pero resuelto con este

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

Esta regla redirigir sin www a www.

Y esta regla para redireccionar a www sin www

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

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

Esto funciona para mí:

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

Yo uso el (?!www.domain.com) modelo de la mirada de la ventaja de excluir el subdominio www al redirigir a todos los dominios del subdominio www con el fin de evitar un bucle de redireccionamiento infinito en Apache.

El código que utilizo es:

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

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

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

... entonces debe establecer NameVirtualHost On así .

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

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

... y, o bien no hay redirección sucede, o si tiene un bucle de redireccionamiento infinito, dependiendo de qué bloque se pone en primer lugar.

Yo tenía una tarea similar en un WP para varios sitios, donde la regla de redirección tenía que ser genérica (para cualquier dominio dado que me gustaría añadir a la red). I resuelto añadiendo primero un comodín para el dominio (dominio aparcado). Nota la . después de .com.

CNAME * domain.com.

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

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

Esperamos que esto ayudará.

ps. Si desea cambiarlo desde la no www a www, cambiar la última línea en

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

Me resultó más fácil (y más útil) usar ServerAlias ​​cuando utilizo varios vhosts.

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

Esto también funciona con https vhosts.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top