Actualizado el domingo, 17 marzo, 2024

Crear URL canónicas para su sitio es una parte importante de un buen SEO. En esta publicación rápida, veremos varias técnicas .htaccess para eliminar y requerir el prefijo www, y además veremos cómo eliminar cualquier index.php de todos los URI.

Para usar cualquiera de estos fragmentos de código, agréguelos al archivo .htaccess raíz de su sitio (o agréguelos a través de la configuración del servidor). 

Eliminar www de todas las URL

Este segmento de .htaccess elimina el prefijo www de todas las URL:

# remove www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
	RewriteRule (.*) https://example.com/$1 [R=301,L]
	
</IfModule>

Edite example.com para que coincida con su dominio y pruebe bien.

Nota: aquí hay una sintaxis alternativa para RewriteCond:

RewriteCond %{HTTP_HOST} !^example\.com$ [NC]

De cualquier manera funciona bien.

Requerir www para todas las URL

Alternativamente, este segmento de .htaccess agrega el prefijo www a todas las URL:

# require www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
	RewriteRule (.*) https://www.example.com/$1 [R=301,L]
	
</IfModule>

Edite example.com para que coincida con su dominio y pruebe bien.

Quitar el índice.php de todas las URL

Este fragmento de código .htaccess elimina el index.php de todas las URL:

# remove index.php
<IfModule mod_rewrite.c>
	
	RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/
	RewriteRule ^(([^/]+/)*)index\.php$ https://example.com/$1 [R=301,L]
	
</IfModule>

Edite example.com para que coincida con su dominio y pruebe bien.

También para su información, aquí está la misma técnica utilizando un sytnax más simple:

ApacheRewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php [NC]
RewriteRule ^index\.php$ https://example.com/ [R=301,L]

Esto hace lo mismo que la técnica anterior, aunque no es tan robusta. Tarea asignada: compare y comprenda las diferencias, explique por qué el primer método es mejor para uso general.

Eliminar www e index.php

Aquí hay un ejemplo de cómo combinar las técnicas anteriores:

# remove www and index.php
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
	RewriteRule (.*) https://example.com/$1 [R=301,L]
	
	RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/
	RewriteRule ^(([^/]+/)*)index\.php$ https://example.com/$1 [R=301,L]
	
</IfModule>

Para requerir el www, simplemente intercambie las dos primeras líneas con las de la técnica «require-www», arriba.

Bono: Drop-in www Canonicalización

Algunos de mis lectores han preguntado sobre una versión plug-&-play del fragmento www/canonical. Aquí tienes..

Drop-in eliminar www

Aquí hay varias técnicas para eliminar el prefijo www.

Drop-in remove www (Método 1):

# remove www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
	RewriteRule (.*) https://%2.%3/$1 [R=301,L]
	
</IfModule>

Drop-in remove www (Método 2):

# remove www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
	RewriteRule (.*) https://%1/$1 [R=301,L]
	
</IfModule>

Drop-in remove www (Método 3):

# remove www
<IfModule mod_rewrite.c>
	  
	  RewriteCond %{HTTPS} !=on
	  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
	  RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
	  
</IfModule>

Drop-in requiere www

Aquí hay varias técnicas para requerir el prefijo www.

Drop-in requiere www (Método 1)

# require www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} ^www\.(.*)\.(.*)$ [NC]
	RewriteRule (.*) https://%1.%2/$1 [R=301,L]
	
</IfModule>

Drop-in requiere www (Método 2):

# require www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTP_HOST} !^www\. [NC]
	RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R=301,L]
	
</IfModule>

Drop-in requiere www (Método 3):

# require www
<IfModule mod_rewrite.c>
	
	RewriteCond %{HTTPS} !=on
	RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
	RewriteCond %{HTTP_HOST} (.+)$ [NC]
	RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
	
</IfModule>

Lo único que necesita para verificar cualquiera de estas técnicas es el protocolo HTTP, de modo que cambie https a http si es necesario.

Notas

Si obtiene un error de servidor 500 para cualquiera de las técnicas anteriores, intente reemplazar [R=301,L] con [R,L], debería hacer el truco.

Algunas de estas técnicas pueden no ser compatibles en sitios donde se utilizan subdominios. Es posible que se requiera una ligera modificación para obtener mejores resultados.

Antes de usar cualquiera de las técnicas directas, asegúrese de que su estructura de URL emplee un solo dominio de nivel superior (TLD), como .com. No utilice las técnicas de entrega directa para TLD plurales, como .co.uk. Entonces, si su sitio está sacudiendo un TLD plural, está bien, simplemente use uno de los métodos manuales proporcionados en la primera mitad de este tutorial.

También recuerde probar bien antes de poner en marcha 🙂