Redirects con Apache: instrucciones de Redirect para CentOS y Ubuntu
Las redirecciones o desvíos de Apache son útiles en muchas situaciones. Entre otras cosas, puedes utilizar los prácticos Redirects para dirigir a los visitantes de la versión HTTP a la versión HTTPS de tu sitio web, redirigir el tráfico de una URL www a una URL sin www o incluso cambiar los nombres de sitios web y directorios. Te ayudamos a entender y configurar las redirecciones de Apache en CentOS y Ubuntu.
- Tu servidor propio en un hardware dedicado
- Integración en el cloud y facturación al minuto
- Respaldados por procesadores Intel® Xeon® y AMD
Redirect 301 o 302: ¿Cuál es la diferencia?
Al analizar las redirecciones o desvíos, es importante distinguir entre Redirects 301 y 302. El primer código de estado (301) representa un desvío permanente, mientras que el segundo (302) indica un desvío temporal.
Una redirección 301 es mucho más apetecible desde la perspectiva del SEO. Si un rastreador de motor de búsqueda se encuentra con un Redirect de este tipo, entiende que se trata de un desvío permanente. Por esta razón, no solo toma nota de la nueva URL, sino que también inicia el proceso de transferencia de cualquier valor de Page Rank de la antigua a la nueva URL, por tanto, la clasificación SEO ya alcanzada se mantiene.
Si, por el contrario, un rastreador detecta una redirección 302, anota la nueva dirección y sigue adelante. Dependiendo del rastreador, puede dejar una marca en la URL para volver a visitarla en el futuro. Esto sucede porque un Redirect 302 se supone que indica que el desvío es solo temporal y que la URL “real” volverá a estar en línea pronto.
Al crear un desvío, especifica siempre que se trata de un Redirect 301. En muchas situaciones, se usa el Redirect 302 por defecto si no se especifica el tipo de redirección.
Redirects 301 de Apache: principios básicos
Si solo necesitas redirigir una única URL o un pequeño número de URL, puedes identificarlas fácilmente de forma individual en el archivo de configuración de Apache de tu proyecto.
Redirección simple de URL
Para una sola redirección 301, puedes usar la directiva Redirect en el archivo de configuración de Apache. La sintaxis sería la siguiente:
Redirect 301 [alte URL] [neue URL]
La nueva URL también puede ser una URL externa. De este modo, se puede comunicar a los usuarios la pegadiza URL example.com/store, por ejemplo, en lugar de tener que transmitir la larga y complicada URL de una página de tienda de Amazon. El siguiente ejemplo redirige el tráfico desde example.com/store a dicha página de la tienda de Amazon:
Redirect 301 example.com/store https://www.amazon.com/s?marketplaceID=...
La directiva Redirect de Apache debe incluirse siempre en el bloque de comandos VirtualHost del archivo de configuración principal del servidor web. El archivo se encuentra en las siguientes ubicaciones por defecto:
- CentOS: /etc/httpd/conf.d/example.com.conf
- Ubuntu: /etc/apache2/sites-available/example.com.conf
La ubicación y el nombre del archivo de configuración de Apache pueden variar en función de cómo tú o tu administrador del servidor hayáis configurado el hosting.
Edita este archivo con un editor de tu elección, por ejemplo, el editor de líneas de comando nano.
CentOS:
sudo nano /etc/httpd/conf.d/example.com.conf
Ubuntu:
sudo nano /etc/apache2/sites-available/example.com.conf
Desplázate por el archivo hasta que encuentres el bloque de comandos VirtualHost, que tiene, más o menos, este aspecto:
<virtualhost *:80></virtualhost>
ServerName example.com
<directory " var www example.com html"></directory>
AllowOverride All
Ahora añade la directiva de redirección de Apache al bloque de comandos VirtualHost. En este proceso, asegúrate de colocar la directiva fuera de los bloques de comandos del directorio:
<virtualhost *:80></virtualhost>
ServerName example.com
Redirect 301 /blog https://blog.example.com
<directory " var www example.com html"></directory>
AllowOverride All
Guarda y cierra el archivo y reinicia Apache para que se apliquen los cambios:
CentOS:
sudo systemctl restart httpd
Ubuntu:
sudo service apache2 restart
Apache: redirección de un directorio
También puedes redirigir un subdirectorio a tu página actual de la misma manera. Por ejemplo, imaginemos que quieres mover el blog de tu sitio web de un subdirectorio('http://example.com/blog') a su propio dominio canónico ('http://blog.example.com'). Las directivas para el Redirect de Apache serían las siguientes:
Redirect 301 /blog https://blog.example.com
Redirección de dominios www a dominios sin www
Es bastante común transferir la versión www de una URL a la versión sin www (o viceversa) a través de una línea “ServerAlias” en el archivo de configuración de Apache. Aunque este enfoque funciona bien desde el punto de vista de los visitantes, no se considera la “mejor práctica” desde el punto de vista SEO.
Porque el uso de “ServerAlias” en lugar de la redirección 301 conlleva el riesgo de que los contenidos afectados se identifiquen como contenido duplicado. Por norma general, no hay otra diferencia entre la versión www y la versión sin www de una URL desde el punto de vista SEO. Es importante que te decantes por una variante.
A continuación, redirigimos el tráfico de la variante www a la variante sin www. De nuevo, necesitamos hacer uso del archivo de configuración principal de Apache, que puedes volver a abrir con el editor de tu elección, por ejemplo, con el editor de líneas de comandos nano.
CentOS:
sudo nano /etc/httpd/conf.d/example.com.conf
Ubuntu:
sudo nano /etc/apache2/sites-available/example.com.conf
Busca la siguiente línea en el bloque de comandos (con el dominio individual de tu proyecto):
ServerAlias www.example.com
Borra esta línea y desplázate hasta el final del archivo. Añade allí el siguiente bloque de comandos “VirtualHost” nuevo:
<virtualhost *:80></virtualhost>
ServerName www.example.com
Redirect 301 / https://example.com/
Guarda y cierra el archivo. A continuación, reinicia Apache para que los cambios surtan efecto.
Redirecciones complejas de Apache con mod_rewrite
Para redirecciones 301 más complejas, el módulo de Apache mod_rewrite es la mejor opción. Este módulo es rápido, flexible y potente, y te ofrece la posibilidad de manipular fácilmente las URL. Puedes definir las reglas apropiadas en un archivo .htaccess, entre otros.
Activar mod_rewrite en CentOS
El módulo mod_rewrite está activado por defecto en CentOS. Si ves que no está activado, siempre puedes activarlo en el archivo de configuración básico del módulo. Para ello, primero abre el archivo con el editor nano:
sudo nano /etc/httpd/conf.modules.d/00-base.conf
Añade la siguiente línea o actívala si ha sido descomentada:
LoadModule rewrite_module modules/mod_rewrite.so
En el siguiente paso, activa el uso de archivos .htaccess. Para ello, abre el archivo principal de configuración de Apache.
sudo nano /etc/httpd/conf.d/example.com.conf
Desplázate hasta el bloque de comandos principal de VirtualHost, que, como ya hemos mencionado, debería tener el siguiente aspecto aproximado:
<virtualhost *:80></virtualhost>
ServerName example.com
<directory " var www example.com html"></directory>
AllowOverride None
Cambia la entrada de “AllowOverride” de “None” a “All”:
AllowOverride All
Si falta la entrada del directorio en el bloque de comandos VirtualHost, añádela manualmente:
<directory " var www example.com html"></directory>
AllowOverride All
Asegúrate de utilizar la ruta correcta del directorio principal de tu sitio web.
Guarda y cierra el archivo. Reinicia Apache para que los cambios surtan efecto:
sudo systemctl restart httpd
Activar mod_rewrite en Ubuntu
Para activar mod_rewrite en un servidor Ubuntu, utiliza el siguiente comando:
sudo a2enmod rewrite
Reinicia Apache para que los cambios surtan efecto:
sudo service apache2 restart
A continuación, permite el uso de archivos .htaccess. Para ello, edita el archivo principal de configuración de Apache:
sudo nano /etc/apache2/sites-available/example.com.conf
Desplázate hasta el bloque de comandos principal de VirtualHost y busca el bloque de comandos de directorio (Directory), que debería tener el siguiente aspecto:
<directory var www example.com html></directory>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
En la línea “AllowOverride” sustituye la entrada por defecto “None” por “All”:
AllowOverride All
Si falta la entrada del directorio en el bloque de comandos VirtualHost, añádela manualmente:
<directory var www example.com html></directory>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Guarda y cierra el archivo. Reinicia el servidor web para que los cambios surtan efecto:
sudo service apache2 restart
Crear un archivo .htaccess para la redirección Apache
Después de haber configurado Apache para usar mod_rewrite y permitir archivos .htaccess, es el momento de ir al directorio de documentos (directorio principal) de tu sitio web y crear un archivo .htaccess.
No es necesario reiniciar Apache después de realizar cambios en un archivo .htaccess.
Si no has realizado ningún cambio, cambia directamente al directorio principal de tu servidor web Apache con la siguiente entrada:
cd /var/www/html
Ahora crea el archivo .htaccess en el directorio y ábrelo con el siguiente comando:
sudo nano .htaccess
Especifica tus configuraciones individuales de mod_rewrite. Comienza con una simple prueba para asegurarte de que todo funciona correctamente añadiendo las siguientes líneas a este archivo:
RewriteEngine on
RewriteRule ^hello.html$ goodbye.html
Esta regla redirige las consultas de hello.html a la página goodbye.html . Guarda y cierra el archivo y luego crea los dos documentos HTML con los siguientes comandos:
sudo echo "Hello" >> hello.html
sudo echo "Goodbye" >> goodbye.html
Ahora accede a la página hello.html en un navegador. Deberías ser redirigido a goodbye.html a través del Redirect Apache y, por lo tanto, ver el mensaje “Goodbye”.
Redireccionar varios dominios a la misma URL a través de Redirect de Apache
Hay varias razones por las que puedes necesitar redireccionar diferentes dominios a la misma dirección:
- Si su sitio principal es example.com , puedes cubrir de forma óptima el espacio del nombre comprando example.net y example.org .
- Tiene sentido registrar también las típicas faltas de ortografía de tu nombre de dominio, como exampl.com o exmple.com, e incluirlas en tu estrategia. Así también te proteges frente al denominado typosquatting.
- También puede ser que hayas adquirido variantes de tu nombre de dominio, como the-example.com o my-example.com, y que desees que los usuarios también acaben llegando a tu proyecto web cuando intentan acceder a estas direcciones.
Aunque también puedes redireccionar estos nombres de dominio a tu página principal de la forma habitual, es aconsejable desde el punto de vista SEO establecer redirecciones 301 para conseguir los objetivos que te has marcado.
Para redireccionar varios dominios al mismo dominio a través de Redirects de Apache, primero activa el módulo mod_rewrite como se describe en la sección anterior y configura un archivo .htaccess adecuado. A continuación, añade las siguientes líneas al archivo .htaccess:
RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301]
En el ejemplo, se desvía el tráfico de datos desde example.net a example.com. Ahora simplemente adapta esta regla a tus nombres de dominio y a los resultados deseados. Por ejemplo, para desviar el tráfico de datos a la versión www de la URL ('www.example.com'), se usaría la siguiente secuencia:
RewriteEngine on
RewriteCond %{HTTP_Host} ^(www\.)?example\.net$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301]
Apache: desviar páginas HTTP a páginas HTTPS: así se hace
Para la seguridad de tus usuarios y tu clasificación en los motores de búsqueda, es de elemental importancia que todo el tráfico en tu sitio web esté protegido mediante SSL/TLS. En este caso, también puedes usar un Redirect 301 de Apache, que redireccione automáticamente a los visitantes a la versión HTTPS de tus páginas.
En este caso, vuelve a configurar primero mod_rewrite y el archivo .htaccess y luego añade las siguientes líneas al archivo de configuración:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://example.com$1 [R=301,L]
Cambiar el nombre de sitios web y desplazar directorios
Hay situaciones en las que puedes necesitar cambiar el nombre de una página o directorio existente. Esto invalidará todos los enlaces que dirigen a esa página, lo que no solo empeora la experiencia del usuario, sino que también afecta a tu clasificación SEO.
Utiliza las siguientes reglas en el archivo .htaccess (después de haber configurado mod_rewrite y el archivo .htaccess).
Cambiar el nombre del sitio web:
RewriteEngine on
RewriteRule ^old-page.html$ /new-page.html [R=301]
Cambiar el nombre del directorio:
RewriteEngine on
RewriteRule ^old-directory/ /new-directory/ [R=301]
En los ejemplos anteriores, los nombres de los archivos y directorios se indican como una ruta relativa al directorio principal del sitio web. Hay tres opciones para las rutas:
- una ruta completa de sistema de archivos como /var/wwww/html/new-page.html
- una ruta web relativa al directorio principal como /new-page.html
- una URL absoluta como 'http://example.com/new-page.html'
Resumen de la información más importante sobre mod_rewrite
El módulo mod_rewrite utiliza expresiones regulares para compensar y reemplazar varias URL. Para activar mod_rewrite, la primera línea de las reglas en el archivo .htaccess debe tener siempre este aspecto:
RewriteEngine on
El núcleo de mod_rewrite son las RewriteRules. Cada RewriteRule consta de tres partes:
RewriteRule [pattern] [substitution] [flags]
El patrón (pattern) se crea con la ayuda de expresiones regulares. Se pueden hacer las siguientes sustituciones:
- una ruta completa de sistema de archivos
- una ruta web relativa al directorio principal
- una URL absoluta
Las banderas son opcionales. Algunas de las más comunes son las siguientes:
- L: indica que es la última de una serie de reglas
- R=301: fuerza una redirección 301
- NC: ignora las mayúsculas y minúsculas para que la regla no distinga entre mayúsculas y minúsculas
Para una lista completa de las banderas disponibles, consulta el sitio web oficial de Apache.
En algunos casos, una RewriteRule se introduce mediante una RewriteCond. Esta define las condiciones en las que la RewriteRule tiene efecto. Una RewriteCond también consta de tres partes:
RewriteCond [test string] [condition] [flags]
El string de prueba suele ser una variable del servidor con el formato %{VARIABLE NAME}.
Existen tres tipos de condiciones (condition):
- expresiones regulares
- comparaciones de cadenas de caracteres
- pruebas de archivos/rutas
Las banderas vuelven a ser opcionales. Hay tres banderas disponibles para la RewriteCond:
- NC: ignora las mayúsculas y minúsculas para que la condición no distinga entre mayúsculas y minúsculas
- OR: “o” lógico
- NV (“No Vary”): el nombre de la cabecera no se inserta en la cabecera de respuesta Vary
¿Cuál es la diferencia entre RewriteRule y Redirect?
Tanto RewriteRule como Redirect 301 de Apache pueden marcarse en un archivo .htaccess para redirigir el tráfico del sitio web. La principal diferencia es que una RewriteRule se implementa mediante el módulo mod_rewrite y un Redirect, mediante el módulo mod_alias.
mod_rewrite | mod_alias |
---|---|
Usa RewriteRule y RewriteCond | Usa Redirect y RedirectMatch |
Es muy versátil, ya que utiliza expresiones regulares para compensar y reemplazar varias URL | No es tan configurable |
Puede ser difícil de manejar | Fácil de manejar |
Puede no estar instalado o activado por defecto | Ya suele estar activado por defecto en la mayoría de las instalaciones de Apache |