Sep172008

Redirección web con el mod_rewrite de apache

A continuación detallaré algunas de las opciones que tenemos actualmente para realizar una redirección web utilizando el módulo mod_rewrite de Apache (servidor web) y el archivo de configuración .htaccess.

Además, comentaré cuales son los usos más comunes en la administración de sistemas de estas redirecciones web.

Redirecciones web

  • Redirección 301 Permanente:
    [Uso práctico] Redirección permanente de nuestros dominios secundarios (.com, .net) a nuestro dominio principal (.es), para que los motores de búsqueda no interpreten a nuestros dominios secundarios como contenido duplicado y nos penalicen.
  • Redirección 302 Temporal:
    [Uso práctico] Redirección temporal de nuestra sección de inicio, mientras se están realizando tareas de actualización y/o mantenimiento.

Redireccion con .htaccess

Las redirecciones web se pueden agregar directamente en el fichero de configuración del dominio del servidor web Apache o dentro del fichero .htaccess ubicado en la raíz del sitio.

RewriteEngine On

# Redireccion web permanente 301 de dominios secundarios con y sin las www
RewriteCond %{HTTP_HOST} !^(.*)\.alejandroarco\.es$ [NC]
RewriteRule ^(.*)$ https://alejandroarco.es/$1 [R=301,L]

# Redireccion web temporal 302 para tareas de mantenimiento
RewriteRule ^$ /mantenimiento.html$1 [R=302,L]

Si tenéis alguna duda acerca del funcionamiento del ejemplo mostrado en el .htaccess para la redirección web no dudéis en agregar un comentario a este artículo.

Fuente: Alejandro Arco

Share

14 Comentarios

+ Añadir Comentario
  • Para hacer un redireccionamiento 301 de la web sin www a la web con www es decir de http://midominio.com a http://www.midominio.com ¿sería suficiente con poner en el archivo htaccess esta linea?

    Redirect permanent /midominio.com http://www.midominio.com

    Esta forma me la han utilizado para direccionar páginas internas y funciona pero no se si será válida para el dominio.

  • @autos-alemania: no te recomiendo realizar redirecciones de ese tipo para alias o nombres de dominio con o sin las www, ya que el método que usas sólo redireccionaría la URL (principal) raíz del dominio.

    Además, creo que la sentencia la tienes mal construida y la tendrías que sustituir por esta otra:

    Redirect permanent http://midominio.com http://www.midominio.com

    Con el método que yo uso redireccionas todas y cada una de las URLs sin www al dominio correspondiente con www, además de todos los alias de dominio asignados en el apache.

    Un saludo,
    Alejandro Arco

  • Gracias Alejandro, al final he puesto este código en el archivo .htaccess

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

    ya que me intención ha sido que redirecciones del www a sin www que tengo mas páginas indexadas.
    Observo que hay algunas pequeñas diferencias con el tuyo
    ¿Como puedo saber si está funcionando?

  • @autos-alemania: funciona correctamente ya que te realizar una redirección web del dominio con www al que no tiene las www, concatenando la sección correspondiente.

    De todas formas, si quieres comprobarlo tú mismo haz las pruebas en el propio navegador poniendo URLs con www y ver que tipo de redirección web 301 se produce.

    Un saludo,
    Alejandro Arco

  • Hola,

    Interesante tu artículo y no se si podré aplicarlo a la solución que quiero: tengo un dominio: inerciaweb.com a los que quiero que apunten por dns al servidor que lo hospeda pero que vayan directamente a su página, por ejemplo: dominio: www.inerciawebshop.com que vaya a la página www.inerciaweb.com/shop pero que no cambie en la url del navegador www.inerciaweb.com

    Es posible realizarlo configurando el .htaccess ?

    Gracias.

    Un saludo.

  • @Vicente: lo que yo te recomendaría dadas las premisas comentadas es que sigas apuntando con las DNS al otro hosting, pero que estos últimos añadan en el archivo de configuración del dominio (en caso de ser un servidor Apache):

    ServerAlias *.inerciawebshop.com inerciawebshop.com

    Y posteriormente en ese mismo archivo de configuración te añadan la redirección 301 que he comentado en el artículo… aunque los resultados quizás no es lo que buscas exactamente, pero te recuerdo que no debe haber contenido duplicado y accesible desde distintos dominios ya que pueden ser penalizados.

    Un saludo,
    Alejandro Arco

  • Hola Alejandro, una pregunta:

    yo tengo un dominio www.midominio.es
    y estoy migrando secciones, así que antes estas eran:
    www.midominio.es/antigua/seccion1
    y las de ahora son
    www.midominio.es/nueva/seccion1

    Como, por motivos operativos, se van subiendo cosas sin estar depuradas, puedo poner una redirección para que cualquier petición a una sección nueva no finalizada, vaya a la home de la sección antigua.

    Es decir, cualquier cosa que vaya a /nueva/seccion2/* se redirija a /antigua/seccion2/index.html

    Muchas gracias por anticipado.
    Un saludo.

  • @Andrés: yo lo que haría en tu caso es una redirección 302 (temporal) de la sección nueva no depurada hacia la sección antigua.

    Posteriormente y conforme vayas finalizando las nuevas secciones, realizaría una redirección 301 de la sección antigua hacia la nueva.

    Simplemente has de crear un RewriteRule para cada una de las secciones, a menos que sean muchas que entonces es aconsejable crear alguna condición.

    Un saludo,
    Alejandro Arco

  • Hola alejandro, tengo una consulta la cual nosé como realizar me han solicitado hacer una redirección 302 de dominio.com a www.dominio.com, pero tengo ya cargado en el .htaccess el siguiente codigo que lo uso para mantener funcional las URL amigables de joomla:

    DirectoryIndex index.php
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR]
    RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php

    ########## Begin – Rewrite rules to block out some common exploits
    ## If you experience problems on your site block out the operations listed below
    ## This attempts to block the most common type of exploit `attempts` to Joomla!
    #
    # Block out any script trying to set a mosConfig value through the URL
    RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
    # Block out any script trying to base64_encode crap to send via URL
    RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
    # Block out any script that includes a tag in URL
    RewriteCond %{QUERY_STRING} (\|%3E) [NC,OR]
    # Block out any script trying to set a PHP GLOBALS variable via URL
    RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
    # Block out any script trying to modify a _REQUEST variable via URL
    RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
    # Send all blocked request to homepage with 403 Forbidden error!
    RewriteRule ^(.*)$ index.php [F,L]
    #
    ########## End – Rewrite rules to block out some common exploits

  • @kendatos: en el caso que me comentas no tiene sentido realizar una redirección temporal 302, haz una redirección permanente 301 con el ejemplo que adjunto en el artículo, simplemente añade a tu .htaccess la condición propuesta.

    Un saludo,
    Alejandro Arco

  • Como puedo controlar desde el .htaccess principal varios subdominios con diferentes reglas de escritura.

    Tengo este codigo pero no funciona…

    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule ^(.*)/(.*)/$ index.php?ac=$1&url=$2 [L]
    RewriteRule ^/images/(.*)/(.*).(.*)$ $1/$2/$3 [L]
    Rewriterule ^([^/]+)/([^/]+)/page/([0-9]+)$  index.php?ac=$1&url=$2&pa=$3&page=page [L]
    ErrorDocument 404 /404.php
    RewriteCond %{HTTP_HOST} ^letras.subdominio.com$ [NC]
    RewriteRule ^(.*)\.onmyownlyrics.com/(.*)$ www\.dominio\.com/$1 [R=301,L]
    

    OJO, lo puse redirección para ver que variables envía y creo que sale el directorio path, pero no se como filtrar.

  • Hola Alejandro.

    Un consulta. Actualmente se tiene una URL de la forma: http://ip:8080/gestor/index.html?language=es
    Y se quiere configurar en el Servidor Web de tal forma que al acceder a
    http://www.midominio.com se vea mi pagina que está en el tomcat

    Ya se tiene el apache y el tomcat configurado. Se han realizado configuraciones y se ha logrado que al indicar en navegador http://www.midominio.com redirecciona a mi URL del tomcat, pero lo que se quiere es que se siga viendo en el navegador http://www.midominio.com aunque realmente se visualiza la pagina del tomcat

    Muchas gracias de antemano

  • Alejandro, muy buena información. Gracias. Quería consultarte en caso de que el sitio tenga 3 dominios distintos (ej: abc.com, def.com y ghi.com) y el principal es abc.com… conviene hacer un redirect 301 de los otros 2 dominios al prinicipal? El tema es que los dominios secundarios tienen mejores keywords en el dominio que el principal. I segun google, tengo algunos pocos archivos duplicados en estos últimos dos dominios. No quiero que me sancione y perder posicionamiento ¿Qué debería hacer según vos? Muchas gracias.

  • Me parece excelente este turorial.
    Solo una consulta si tuviera una url asi como esta
    https://www.miweb.com/index.php?pag=nombredepagina&o_aoID=8073-2010
    Como sería la configuración de mi htaccess?
    Gracias de Antemano, por la ayuda.
    Saludos,

Si tienes alguna consulta, escríbela ...