El htaccess genérico redirige www a no www

484

Me gustaría redirigir www.example.coma example.com. El siguiente código htaccess hace que esto suceda:

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

Pero, ¿hay alguna manera de hacer esto de manera genérica sin codificar el nombre de dominio?

pozo profundo
fuente
64
Es importante tener en cuenta que si no utiliza un www (o algún otro subdominio), todas las cookies se enviarán a cada subdominio y no podrá tener un subdominio sin cookies para servir contenido estático, reduciendo así cantidad de datos enviados de ida y vuelta entre el navegador y el servidor. Algo de lo que luego te arrepentirás: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Otra cosa a considerar, asegúrese de establecer el nombre canónico sin el www en sus páginas, para evitar una posible penalización por contenido duplicado. Además, si tiene direcciones URL absolutas en sus enlaces, asegúrese de que no sean todas www.
Jeremy Morgan
En mi opinión, es mejor mantener la redirección explícita, especialmente al copiar la configuración para otro dominio, que podría requerir una optimización diferente (el dominio www es mejor en algunos casos) weboptimizer.ch/2014/01/redirection-www
snowflake
¿Alguna razón por la que esta solución funcionaría para todos los casos excepto la URL raíz? Por ejemplo domain.com ¿no piont domain.com , mientras que domain.com/page1 hace redirección a domain.com/page1 .
Jeff Solomon
Si desea redirigir www a no www mientras mantiene el protocolo (HTTP o HTTPS), consulte esta pregunta relacionada: Redirigir www a no www mientras mantiene el protocolo HTTP o HTTPS
MrWhite

Respuestas:

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

Igual que el de Michael, excepto que este funciona: P

Volomike
fuente
16
Si no funciona, probablemente le falte el RewriteEngine Onprecursor para que funcione.
hendry
8
@Ben, ¿cómo usaría esto a la inversa para agregar www a un sitio web que no sea www?
anarkhos
18
Se redirige http://www.domain.com/a http://domain.com//. Deberías agregar /a la RewruteRule. Esto funciona para mi RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov
13
Estaba teniendo el mismo problema que Vladimir al redirigirlo http://domain.com//con las barras dobles. Así que lo hice RewriteRule ^(.*)$ http://%1$1 [R=301,L] y parece estar funcionando hasta ahora
bobfet1
55
Utilice la siguiente solución en lugar de reescribir el motor, es mucho más rápido y elegante: stackoverflow.com/questions/1100343/…
Birla
111

Pero si necesitamos hacer esto para http y https por separado:

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Andron
fuente
2
www.example.com/ redirige a example.com// ¿Alguna forma de eliminar la barra extra?
Bobby S
Buena pregunta. Supongo que la solución rápida será usar reglas adicionales (es decir, solo para este caso) antes de las descritas anteriormente. Por ejemplo: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron
3
@BobbyS Usé la solución en este artículo . Redirige www y HTTP a HTTPS que no sean www y también maneja el seguimiento /.
totymedli
Solo obtendría una barra inclinada adicional (al comienzo de la ruta URL), si hubiera colocado estas directivas directamente en la configuración del servidor (o virtualhost). En .htaccessno deberías obtener una barra extra. (Solo para tener en cuenta, si está realizando esta redirección en la configuración del servidor, entonces probablemente no debería usar mod_rewrite para comenzar ... un simple mod_alias Redirecten el contenedor vhost apropiado sería más eficiente y menos propenso a errores)
MrWhite
72

Redirigir no www a www (ambos: http + https)

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Dmitriy
fuente
44
@nightcoder Esto se debe a que mi solución para la redirección inversa (de no www a www) en lugar de Andron's
Dmitriy
2
Nota: esta solución puede causar algunos problemas si tiene la intención de usar nombres de subdominio para otros fines. Por ejemplo, app.yourdomain.com será redirigido a www.app.yourdomain.com.
Marty ZHANG
1
Esto es exactamente lo contrario de una respuesta a la pregunta.
John
Tuve que agregar RewriteEngine Ony RewriteBase /, pero por lo demás funcionó bien.
pensar demasiado
33

Estas son las reglas para redirigir una URL www a no-www:

#########################
# redirect www to no-www
#########################

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

Estas son las reglas para redirigir una URL sin www a www:

#########################
# redirect no-www to www
#########################

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

Tenga en cuenta que usé NEflag para evitar que apache escapara de la cadena de consulta. Sin este indicador, apache cambiará la URL solicitada http://www.example.com/?foo%20barahttp://www.example.com/?foo%2250bar

Salman A
fuente
1
¿puede escribir código para redirigir http a https junto con redirigir www a non-www
HYDER ALI
Cambie http: // a https: // para forzarlo a HTTPS cuando cambie. También querrá agregar una redirección http-> https regular para el tráfico que no está siendo redirigido por estas reglas.
diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

La RewriteCondcaptura todo en la HTTP_HOSTvariable de después de la www.y lo guarda en %1.

Las RewriteRulecapturas de la URL sin el líder /y lo guarda en $1.

Michael Cramer
fuente
1
sans leading "/"- En .htaccess(como se indica en la pregunta) no hay guiones /, por lo que el patrón nunca coincide y la redirección nunca ocurre. (Solo hay una barra diagonal en un servidor o contexto de host virtual ). Además, si tiene alguna directiva mod_rewrite después de esto, necesitará el Lindicador.
MrWhite
7

Prueba esto:

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

Si el host comienza con www, pegamos todo el host en el inicio de la URL, luego quitamos el "www".

Greg
fuente
1
RoBorg, desafortunadamente su configuración no funciona, si intento esto: example.com/hello/world termino aquí: example.com/hello/world/world También tuve que agregar una barra después de% {HTTP_POST} en el First RewriteRule
deepwell
2
Estoy usando Apache / 2.2.9 (Unix). Funciona para www.website, que redirige a la página web Pero para lo siguiente: página web / test -> va a: websitetest i fijo esto mediante la adición de otro / segundo error: página web / test / n va a websitetest / n / n
pozos profundos
1
El mismo problema que @deepwell con este.
neemzy
Los problemas que tienen los lectores anteriores se deben a que estas directivas están destinadas a la configuración del servidor (o vhost), no .htaccess. En un contexto de directorio ( .htaccess), debe cambiar el primero RewriteRuleen leer: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](requiere Apache 2.2.12+). Tenga en cuenta la adición de la barra inclinada y el DPIindicador (Descartar información de ruta) para evitar que parte de la ruta URL se duplique aparentemente (que en realidad es "información de ruta") como se indicó en comentarios anteriores. Sin embargo, hay directivas más simples, como se cubre en las otras respuestas.
MrWhite
7

Completo controlador WWW genérico, http / https

No vi una respuesta completa. Lo uso para manejar la inclusión de WWW.

  1. Genérico. No requiere información de dominio.
  2. Fuerzas WWW en el dominio primario: www.dominio.com
  3. Elimina WWW en subdominios: sub.domain.com
  4. Conserva el estado HTTP / HTTPS.
  5. Permite cookies individuales para dominios / subdominios

Por favor, hágame saber cómo funciona esto o si dejé una escapatoria.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Gregor Macgregor
fuente
La pregunta original pide redirigir wwwa non- www. Estás forzando la inclusión de www.
Vadim
6

Creo que puede haber mucha información errónea sobre las redirecciones de htaccess. En primer lugar, asegúrese de que su sitio se ejecute en Unix con Apache y no en un host de Windows si espera que este código funcione.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

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

(Sin embargo, asegúrese de que no haya espacios de línea entre cada línea de texto; he agregado un espacio adicional entre líneas para que se vea bien en esta ventana).

Este es un fragmento de código que se puede utilizar para dirigir la versión www de su sitio a la versión http: //. También hay otros códigos similares que se pueden usar.

Redireccionamiento Htaccess
fuente
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Para subcarpeta

pelajar
fuente
3

Para aquellos que necesitan poder acceder a todo el sitio SIN el prefijo 'www'.

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

Mare asegúrate de agregar esto al siguiente archivo

/site/location/.htaccess 
Almiar
fuente
Este ejemplo no está completo: no está configurando la protosslvariable de entorno (esta no es una variable estándar / de servidor). Esto siempre estará vacío, por lo que siempre se redirigirá a http. (La idea detrás de la configuración protosslanterior en el código es para cuando se desea preservar el protocolo al redirigir Sin embargo, en estos días es probable que se deben redirigir a. httpsTodo el tiempo.)
MrWhite
3

Usando .htaccess para Redirigir a www o no www:

Simplemente coloque las siguientes líneas de código en su archivo principal .htaccess raíz. En ambos casos, simplemente cambie domain.com a su propio nombre de host.

Redireccionar a www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Redirigir a no www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

cambie DOT a =>. !!!

Rohallah Hatami
fuente
2

Utilicé la regla anterior para fwd www a no www y funciona bien para la página de inicio, sin embargo, en las páginas internas están enviando a /index.php

Encontré esta otra regla en mi archivo .htaccess que está causando esto, pero no estoy seguro de qué hacer al respecto. Cualquier sugerencia seria genial:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
Luke
fuente
Debe colocar reglas de redireccionamiento que no sean www antes de las que ha citado.
Vladimir Jovanović
2

www a no www con https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rajith Ramachandran
fuente
2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Si desea eliminar wwwen ambos httpy https, use lo siguiente:

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

Esto redirige Non ssl

a

Y SSL

a

en apache 2.4.*puedes lograr esto usando una directiva Redirectcon if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
Starkeen
fuente
2

uso: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

O .htaccess:

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

y el método PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
programa antimalware
fuente
1

La única forma en que lo hice funcionar ...

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

Si estás forzando www. en url o forzando ssl prototcol, luego intente usar posibles variaciones en el archivo htaccess, como:

RewriteEngine On
RewriteBase /

### Force WWW ###

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

## Forzar SSL ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## Bloquear IP ###
Orden denegar, permitir
Negar desde 256.251.0.139
Negar desde 199.127.0.259
misterio
fuente
Apache puede escuchar otro puerto, por ejemplo, 81. Así que en lugar de RewriteCond %{SERVER_PORT} 80mejor utilizar dicho cheque más universal:RewriteCond %{HTTPS} off
Andrón
1

La respuesta seleccionada y muchas otras soluciones aquí eliminaron la parte de la url después de /, por lo que básicamente siempre se redirigió al dominio principal, al menos para mí. Así que estoy agregando una muestra de trabajo respetando la ruta completa después de la barra diagonal.

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

Enfoque alternativo si la personalización de .htaccess no es la opción ideal:

He creado un servidor de redireccionamiento simple para uso público. Simplemente agregue un registro A o CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Más información: https://simpleredirect.net

Bobík
fuente
0

No estoy seguro de por qué quieres eliminar www. Pero la versión inversa sería:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

Y la ventaja de este script es: si tiene algo como test.whattimein.com o cualquier otro (entorno para desarrollar / probar) no redirigirá U al entorno original.

local
fuente
2
Si el subdominio www debe incluirse o no es realmente una cuestión de preferencia personal y puede depender del nombre de dominio y el público objetivo. El código genérico publicado anteriormente para redirigir www a none-www también maneja entornos de prueba OK, ya que la redirección solo ocurre cuando el "www". se encuentra el subdominio
MrWhite
1
Esta pregunta hace lo contrario de lo que pregunta el usuario, que solo contamina la publicación.
Vadim
0

Esto se actualiza para funcionar en Apache 2.4:

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

El único cambio frente a Michael es eliminar el [NC], que produce el error "AH00665":

La opción NoCase para el patrón no-regex '-f' no es compatible y se ignorará

William Entriken
fuente
La respuesta anterior no necesitaba "actualización para funcionar en Apache 2.4". La "advertencia" que está citando (AH00665) se relaciona con una directiva diferente (por ejemplo, si tenía algo así RewriteCond %{REQUEST_FILENAME} !-f [NC]). La NCbandera hace poca diferencia en lo anterior, sin embargo, la razón por la NCque se debe usar aquí es para capturar la pequeña fracción del tráfico de bot que (incorrectamente) envía un nombre de host en mayúscula.
MrWhite
0

Agregado si localhost, ignore la redirección (para fines de desarrollo en el entorno local). Si no es localhost Y (no https O es www), redirija a https y no www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Jeaf Gilbert
fuente
Elabore su código para que el OP entienda cómo esto responde la pregunta.
RyanNerd
-2

Hola, puedes usar las siguientes reglas en tu archivo htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
fuente
La pregunta es pedir una solución "genérica" ​​que no incluya el nombre de dominio. Su solución también hace todo lo contrario de lo que se pide en la pregunta (sin www a www, en lugar de www a no www) sin explicación.
MrWhite