Ir al contenido principal

Mi colección de datos sobre htacces

 Mi colección de datos sobre htacces



Un saludo para todos.

Indice

Introducción

Este pequeño archivo htaccess, al parecer tiene un potencial mucho más grande que su tamaño.

No lo he usado mucho, solo lo he visto en mis desarrollos cuando trabajo en algún framework.

Pero recientemente, reutilizando un código en php, con un poco de javascript, me encuentro con una declaración de solo dos lineas en ",htaccess".

La declaración es la siguiente, solo son dos lineas en el archivo mencionado:


    RewriteEngine on

    RewriteRule ^([a-zA-Z-]+)$ ?pagina=$1

Sin embargo luego de ver las declaraciones, tuve que profundizar un poco más, ya que funcionaba bien. 

Pero no tenia idea de porque o como.

Y bueno lo que funcionaba bien es que por medio de un solo archivo php, podia servir diferentes vistas, basadas en fracciones de código html, en archivos php.

Teniendo en cuenta que include_once, ya me permitía realizar esa inclusión, no había nada novedoso hasta allí, sin embargo la segunda linea del código anterior permitía la inclusión de no solo uno si no de multiples include_once, que se pueden variar con condicionales.

Es convertir el index.php en un servidor de vistas, lo que facilita mucho la reutilización de código, y la redirección de un visitante dependiendo de su estado (estados[registrado - no_registrado - ingreso(logeado) - no_ingreso(nologeado) - ubicacion]... etc),

Dandole un vistazo al código, este no usaba el "config,php", que acostumbro yo, es más... lo busca y si no lo encuentra continua (esto ultimo lo elimine porque me parece riesgoso, si alguien cuela el config en el servidor, a no ser que se prevenga, e incluso alerte). 

Luego de buscar el archivo mencionado, evalua si hay un incio de sesion menor a una hora, y de ser así, evalua si hay un llamado de página con '$_GET["pagina"]', haciendo un include_once del parcial correspondiente, que como vemos al final de la segunda linea del código aparece la variable "?pagina=$1" así pues determina que fracción del código de página es presentada en pantalla.

Algo que me gusto mucho por el ahorro de espacio y la reutilización del código, luego se declaraba una lista blanca. Yo declare dos (2), una para la sesion iniciada, y otra para cuando no haya una sesion iniciada.

La lista o listas blancas mencionadas, se determinan con un condicional, si se admiten se presentan, de lo contrario se pueden programar mensajes predeterminados.

Y a estas alturas ya debes querer el código del que hablo, pues bien es un punto de venta con PHP, jQuery y Bootstrap. Gratis y open source.

Dejo en enlace de descarga para quien desee descargarlo.


Si tienes problemas con la descarga, te dejo un tutorial:  Ver tutorial.

Expresiones Regulares

Lo que más me intrigaba, aunque algo familiar, pero poco usado de mi parte eran los mamarachos depués de "RewriteRule", ¿que significan o como interpreto eso?.

Pues se trata de expresiones regulares, dejo a continución el significado de estas expresiones regulares en htaccces:

  • []        Especifica una clase de caracteres, en el que cada carácter dentro de los corchetes sea una coincidencia. 

Ejemplo: [xyz] coincidirán con x, y, o z.

  • []+        Cualquier combinación de caracteres que coincida con los del interior de los corchetes. 

Ejemplo: [xyz]+ coincidirá cualquier número de x, y, z o cualquier combinción de estos caracteres.

  • [^]        Especifica la clase de no inclusión de caracteres. 

Ejemplo: [^xyz] coincidirá cualquier caracter que no sea x, y ni z.

  • [a-z]        Un guión (-) entre dos caracteres dentro de una clase de caracteres ([]) denota el rango de caracteres entre ellos. 

Ejemplo: [a-zA-Z] coincide con todas las letras mayúsculas y minúsculas de la a la z.

  • a{n}    Especifica un número n exácto de caracteres precedentes.

Ejemplo: x{3} coincide exactamente con tres x.

  • a{n,}    Especifica n o más caracteres precedentes. 

Ejemplo: x{3,} coincide tres o más x.

  • a{n,m}    Especifica un rango de número de caracteres precedentes entre n y m. 

Ejemplo: x{3,7} coincide con tres, cuatro, cinco, seis o siete x.

  • !    Declara una negación. 

Ejemplo: (!palabra) coincide con cualquier cosa salvo con (palabra).

  • +    Coincide con uno o más caracteres precedentes. 

Ejemplo: J+ coincide con una o más J, mientras "+" coincidirá con uno o más caracteres de cualquier tipo.

  • *        Coincide con cero o más caracteres precedentes. 

Ejemplo: utilizando la expresión "[a-zA-Z]d*" será posible encontrar tanto "J" como "J1", "J01", "J100" y "JA1000"

  • |        Declara un operador lógico "or". 

Ejemplo: (x|y) coincide con x o y.

  • .        Indica un punto literal (escapado).

Escapa caracteres especiales (^$!.*|). 

Ejemplo usa "." para indicar/escapar un punto literal.

  • /*            Cero o más barras.
  • .*            Cero o más caracteres arbitrarios.
  • ^$           Define una cadena vacía.
  • ^.*$        El modelo estándar para hacer coincidir todo.
  • [^/.]        Define que no sea barra o punto.
  • [^/.]+      Define cualquier número de caracteres que no sean ni barra ni punto.
  • -d        Representa un dígito del 0 al 9.
  • -s        Representa un espacio en blanco.
  • .          El punto busca cualquier carácter SIN incluir los saltos de línea.
  • ()        Se usa para agrupar caracteres entre ellos, debiéndose considerar como una unidad.
  • ^        Denota el inicio de una cadena de prueba regex (expresión regular).
  • $        Denota el final de una cadena de prueba regex (expresión regular).
  • ?        Declara como opcional el caracter precedente. 
Con esto ya se facilita la comprensión del código, y el uso del mismo.
Aún tenía mucha curiosidad sobre el asunto, así que seguí indagando.

¿Qué es .htaccess?

Los archivos .htaccess son archivos de texto simples que se utilizan para configurar servidores web. Los archivos .htaccess son útiles cuando no tiene acceso al archivo de configuración del servidor web nativo (como en los servidores compartidos) pero necesita configurar el servidor web para redirigir o reescribir algunas páginas web, bloquear y permitir el acceso a ciertos hosts, etc.
En mi caso particular se trata de apache.

Y que diablos es "RewriteEngine"?

Me quedaba la duda, y no me iba a quedar con ella. Así que seguí indagando y encontré lo siguiente:

Un RewriteEngine es un componente de software de un servidor web que permite reescribir o redireccionar URL. 
Su denominación está compuesta por los términos procedentes del inglés “rewrite” (reescribir) y “engine” (máquina, motor).
El más conocido es el mod_rewrite del servidor HTTP Apache, aunque también otros servidores web como nginx o lighttpd disponen de estas funciones.
Este módulo de reescritura encuentra aplicación cuando, por ejemplo, hay que transformar una dirección URL inmanejable, como las que generan los sistemas de gestión de contenidos, en URL amigables.
Los motivos saltan a la vista. Veamos estas dos direcciones:

"http://ejemplo.com/a/index.php?title=titulodelapagina"

"http://ejemplo.com/articulo/titulodelapagina"

Las direcciones generadas técnicamente, como la primera, son difíciles de recordar por los usuarios, pero un RewriteEngine permite que el mismo recurso esté disponible de forma paralela bajo una dirección URL mucho más sencilla, como vemos en la segunda línea.

De esta forma, un internauta también puede hacer uso de este URL para ir a la página correspondiente.
Cuando el servidor web recibe una petición de este tipo, el RewriteEngine reescribe automáticamente el URL según el esquema que usa el servidor internamente (primera dirección del ejemplo anterior).

Podría decirse que el software crea una especie de capa de abstracción que se sitúa entre los URL que el proyecto web utiliza a nivel interno y aquellos que se muestran de forma pública en la red; esto es lo que permite mostrar un esquema de direcciones unitario y amigable independientemente de los requisitos técnicos.
Yo la llamaría una interfaz para que el usuario acceda a los recursos disponibles del sitio, con una dirección URL sencilla y previamente programada.
Mientras que internamente la dirección dinámica puede seguir usándose, el usuario tiene la posibilidad de acceder a una página con una dirección aparentemente estática, cuya ventaja radica en que sigue siendo válida incluso cuando se realicen cambios internos en la jerarquía de los archivos.

Otro de los beneficios de los RewriteEngine para los operadores web es que permite implementar desvíos en función de determinadas condiciones.
Esto permitiría, por ejemplo, configurar una redirección para implementar una acción de geotargeting (redirecciona segun ubicación geográfica - ideal para la adaptación de idiomas de forma automática) o para mostrar páginas web optimizadas específicamente para ciertos terminales, basándose en la identificación del agente de usuario o en la dirección IP del cliente que realizó la petición.
Aquí suele usarse una redirección 301 que garantiza, a pesar del funcionamiento en paralelo de páginas móviles adicionales o de versiones en diferentes idiomas, que se almacene únicamente una versión en el índice del buscador.
En cualquier caso habría que distanciarse de prácticas como el cloaking, con la cual se optimizan páginas web exclusivamente en función de la araña del buscador para lograr un buen posicionamiento.

Conclusion "RewriteEngine"

De lo anterior concluí que en escencia se trata de una redirección, es decir asignar a una dirección x, un dirección y.
Y redirección 301?
Es que hay otras?
Que diferencia hay?
Y que es cloaking?
Se comprendian ya muchas más cosas, pero se habría un horizonte de dudas, y segui con en 301, y el cloaking......
Y si, se alarga el artículo, pero eso lo enriquece.

Sobre el cloaking

Encubrimiento, literalmente traducido.
En el SEO, es cuando los motores de busqueda son "engañados", o no están programados (ya sea por imposibilidad o por desarrollos en proceso) para detectar algunas practicas para mejorar el SEO.
Si quieres saber más sobre el cloaking, te dejo este artículo:
(A mi ya me sancionaron, y ni sabia el porque jajaja. Pero aquí esta.)

Qué son las redirecciones 301 y 302 y cómo configurarlas

La diferencia entre 301 y 302, es que 301 es una redirección permanente, mientras que 302 es una redirección temporal
Siempre que tenemos que hacer redirecciones del tipo 301, 302 (status code 301, 302) o de otro tipo suelen surgir las mismas preguntas. Te cito algunas de las más habituales: ¿está mi página web preparada para ello? ¿Qué tipo de redirección es la más adecuada para mi caso? ¿Perderé todo el trabajo de SEO que he hecho hasta el momento? ¿Me penalizará Google? ¿Qué ocurre si un día elimino las redirecciones? Y, sobre todo: ¿cómo se hacen?

Explicado de un modo muy resumido, las redirecciones 301 y 302 son una forma de decirle al crawler de Google o a su robot de rastreo que la URL de una página web ha cambiado de manera permanente o temporal.

Primero quiero aclarar que a veces podemos encontrar este redirect 301 y redirect 302, como error 301 o error 302, pero esta no sería la forma correcta de llamarlo, ya que realmente no es un error como tal sino que es una aplicación consciente del redireccionamiento 301 y redireccionamiento 302.

Se trata de hacer una especie de reenvío para que, cuando un usuario carga la URL antigua/original se le redirija automáticamente a la dirección URL nueva que hemos aplicado, sin que este sea apenas consciente. Si no se hace una redirección y se mueve o se elimina la URL, cualquier usuario que tenga la dirección de URL antigua verá un error. Por no hablar de los backlinks que apuntaban a esa URL y nos estaba dando buenos resultados.

Siempre que entendamos para qué se utilizan las redirecciones y cómo podemos hacerlas, no hay por qué angustiarse si nos vemos en la situación de tener que emplearlas.

Veamos ahora con más detalle en qué consisten.

La redirección 301

Cada vez que se introduce el código 301, que es un código de estado HTTP, estamos ante una redirección de tipo permanente, que se utiliza cuando la dirección URL de una página se ha modificado.

Asimismo, esta fórmula también puede resultar útil cuando creamos una nueva página (por ejemplo, un post) con contenido actualizado de otra ya existente y queremos evitar que Google nos penalice el ranking de dichas páginas por contenido duplicado.

Cuando aplicamos una redirección 301 o status 301 a una URL que ya está bien posicionada en los buscadores de internet, la próxima vez que el robot (o bot) de Google u otro buscador visite esa página, entenderá que la URL ya está obsoleta y la sustituirá por la nueva URL a la que apunta la redirección.

A los ojos de Google, al hacer una redirección 301 contamos con una nueva URL que mantiene el mismo peso y autoridad que ha acumulado la anterior. Ahora bien, para que esto sea del todo así, se debe hacer correctamente.

Aquí tienes algunos ejemplos de circunstancias en las que podemos recurrir a una redirección 301:
  • Cuando debemos hacer un cambio de dominio.
  • Cuando hemos de realizar un cambio en las URL para que sean semánticas (o amigables).
  • Aprovechar el posicionamiento de un post antiguo ya obsoleto para crear un artículo nuevo con un contenido de mayor calidad y actualizado.
  • Para hacer un cambio de estructura de la arquitectura web. Ejemplo: noticias.inboundcycle.com/blog/posts-tips a inboundcycle.com/blog.
  • Para resolver o prevenir problemas por contenido duplicado (algo muy común cuando hacemos un cambio del nombre de dominio).
  • Para solucionar canibalizaciones entre dos o más páginas que, por tener contenido muy similar o competir por las mismas keywords, están mal posicionadas.
  • Para implementar las SSL y hagas una migración de ‘http’ a ‘https’.
Una vez hemos aplicado nuestra redirección o redirecciones, no es necesario que estas estén permanentemente activas. De hecho, se calcula que en unos seis meses ya se habrán propagado todas las nuevas URL a Google. Pese a todo, es recomendable esperar un año antes de comenzar a eliminar las redirecciones.

La redirección 302

El código 302 señala una redirección temporal.
Uno de los rasgos más notables que la diferencian de una redirección 301 es que, en el caso de las redirecciones 302 o status code 302, no se traspasa la fuerza del SEO a la nueva URL.
Esto es debido a que esta redirección ha sido diseñada para utilizarse cuando existe la necesidad de redirigir contenido a una página que no será la definitiva.
Así, una vez eliminada la redirección, la página original no habrá perdido su posicionamiento en los buscadores.

Aunque no es muy habitual que nos encontremos en la necesidad de realizar una redirección 302, esta opción puede ser muy útil en casos como:

Cuando nos percatamos de que hay un contenido erróneo en una página.
Mientras solucionamos el problema, podemos redirigir al usuario a otra página que puede resultar de interés.

En el caso de que un ataque a nuestro sitio web requiera la restauración de alguna de las páginas, esta redirección puede ayudarnos a minimizar la incidencia.

Otros tipos de redirección que no está de más saber

En la mayoría de ocasiones las redirecciones 301 y 302 son la mejor solución y, por tanto, las más comunes.
Sin embargo, es conveniente conocer el resto de redirecciones que hay disponibles para saber cuál es la opción más acertada para casos menos corrientes.
Así estarás haciendo todo lo posible por mejorar la experiencia de usuario, lo que Google agradecerá.

Redirección 303

Rara vez tendrás que usar el código 303 para tus redirecciones, ya que, a diferencia de las 301 y 302, con el 303 no estarás ofreciendo al usuario la página que te está pidiendo en una dirección equivalente. Por tanto, no se usan como gesto amigable para SEO.

En realidad, se trata de una redirección temporal que se usa justo después de una acción PUT o POST de manera que, al actualizar la página que hace la petición, no se vuelve a ejecutar la operación.

Por ejemplo, imagina que tu web es de un centro médico y tienes un formulario de citas. Si quieres evitar la duplicidad de citas cada vez que un usuario termina de completar el formulario y pulsa en el botón de regreso del navegador, lo más recomendable es hacer una redirección 303. También se usan para pasar a una página de confirmación o una página de progreso de carga.

Redirección 304

En este caso no hemos modificado la URL, sino que queremos indicar a los motores de Google que cargue la versión almacenada en caché para aprovechar la mayor velocidad de carga posible.

Cuando un navegador guarda un recurso en la caché lo que hace es recopilar la información del último encabezado modificado y enviado desde el servidor de la web. De manera que, cuando el navegador regresa a esa página web y desconoce si tiene la última versión, entonces se envía una solicitud de validación al servidor. Si esa versión no ha sido modificada, entonces el servidor envía el código HTTP 304. En cambio, si la versión está desactualizada, se envía un código 200 y se emplea una nueva copia.

Redirección 307

Esta redirección es similar a la 302, ya que también es de tipo temporal. En este caso se emplea cuando las operaciones que no son GET están disponibles en el sitio. Es decir, a diferencia de las 302, las 307 no permiten cambiar el método de envío de POST a GET.

Redirección 308

Es una redirección permanente muy similar a la redirección 301, pero es algo más limitada, ya que en este caso no permite cambiar el método de solicitud de POST a GET. Por tanto, la redirección 308 es el equivalente de la 307 aplicado a una redirección permanente (no temporal, como es la 307). Lo mejor es tratar de usar la 301 siempre que sea posible para no afectar al SEO.

Cómo crear una redirección con .htaccess

El mejor método para realizar redirecciones es con el archivo .htaccess (únicamente válido para servidores Apache).
Mediante un cliente FTP deberemos acceder a la raíz de nuestra página web.
Si no conocemos los datos para poder entrar en ella, habrá que solicitar a nuestro proveedor de hosting que nos facilite la información necesaria para acceder al servidor a través de FTP.

Una vez en los archivos de nuestra página web, veremos un archivo .htaccess en la raíz del directorio. Este archivo aparece oculto por defecto.
Por lo tanto, dependiendo de la configuración de nuestro cliente de FTP, probablemente tendremos que activar la opción que nos permite ver los archivos ocultos.

Se puede editar el archivo con cualquier programa de edición de código, o bien con un editor de texto sin formato, como el bloc de notas de Windows.
Antes de modificar el archivo es conveniente hacer una copia de seguridad que nos permita dejar el sitio web tal como estaba antes de realizar los cambios.

Para que tu archivo .htaccess pueda hacer la redirección, es indispensable que el servidor Apache tenga habilitado el parámetro mod_rewrite.
Aunque normalmente siempre está activo por defecto, en caso de que no sea así, de nuevo tendremos que contactar con nuestro proveedor de hosting para que lo habilite.

A continuación te muestro los ejemplos más comunes a la hora de realizar una redirección.

Mover un dominio completo

Si tenemos que hacer un cambio de dominio completo pero queremos mantener la arquitectura de la web intacta, podemos hacer una redirección muy sencilla que indique cuál es el nuevo dominio.
    
    Options +FollowSymLinks
    RewriteEngine on     RewriteRule (.*) https://nuevo-dominio.com/$1 [R=301,L]


Este código nos haría la siguiente redirección:

    
    https://viejo-dominio.com/     https://nuevo-dominio.com/    


Redirigir al subdominio WWW

Si has investigado un poco sobre posicionamiento web (SEO) o has hablado con algún consultor o especialista, probablemente te habrán recomendado más de una vez que tu dominio principal debería comenzar por www.
No te apures, esta es una redirección muy común y puedes realizarla de la siguiente manera.
    
    Options +FollowSymLinks     RewriteEngine on RewriteCond %{HTTP_HOST} *!^www*.dominio\.com [NC] RewriteRule (.*) https://www.dominio.com/$1 [L,R=301]    

Esta redirección nos daría como resultado:

https://dominio.com/
https://www.dominio.com/

Así mismo, también se ha dado el caso inverso, es decir, redirección el dominio de www a no-www. Para ello, el procedimiento es prácticamente el mismo. Este sería el código a introducir:
 
   Options +FollowSymLinks RewriteEngine on RewriteCond %{HTTP_HOST} ^www*.dominio\.com [NC] RewriteRule ^(.*)$ https://dominio.com/$1 [L,R=301,NC]

Redirigir un directorio

En ocasiones cambiamos el nombre de un directorio o un elemento jerárquico del que dependen otras direcciones, como la categoría de un blog. Siguiendo con el ejemplo de la categoría, que quizá es más fácil de comprender, si decidimos cambiar o ampliar el nombre de esta categoría por el motivo que sea pero sin alterar el resto de la estructura de la URL, tenemos que hacer este tipo de redirección.

Siguiendo con el método del archivo htaccess, este sería el código a introducir:
 
   RedirectMatch 301 ^/vieja-categoria/(.*)$ https://dominio.com/nueva-categoria/$1

Este ejemplo nos generaría una redirección como esta:

https://dominio.com/vieja-categoria/titulo-de-mi-post/
https://dominio.com/nueva-categoria/titulo-de-mi-post/

Redirigir una página concreta

Una redirección clásica que podemos necesitar es la del cambio de URL de una página o un post concreto. Lo haríamos así:

 Redirect 301 /antigua-pagina/ https://dominio.com/nueva-pagina/

Esto nos daría el siguiente resultado:

https://dominio.com/antigua-pagina/
https://dominio.com/nueva-pagina/

Otros métodos para realizar redirecciones

Pese a todo, cabe destacar que no siempre tenemos la posibilidad de acceder al archivo .htaccess, o puede que no estemos trabajando sobre un servidor Apache.
La buena noticia es que en cualquiera de ambas situaciones hay alternativas para realizar redirecciones. En WebConfs puedes consultarlas todas, pero aquí tienes las más habituales:

Redirección PHP


 <?php Header( "HTTP/1.1 301 Moved Permanently" ); Header( "Location: http://dominio.com" ); ?>

Redirección ASP

 
    <%@ Language=VBScript %>     <%     Response.Status="301 Moved Permanently" Response.AddHeader "Location","http://dominio.com/"     %>

Redirección ASP .NET


    <script runat="server">     private void Page_Load(object sender, System.EventArgs e) { Response.Status = "301 Moved Permanently"; Response.AddHeader("Location","http://dominio.com/"); } </script>

Redirección JSP


    <%     response.setStatus(301); response.setHeader( "Location", "http://dominio.com/" ); response.setHeader( "Connection", "close" );     %>

Redirección CGI Perl

    $q = new CGI;     print $q->redirect("http://dominio.com/");

Redirección en Ruby On Rails


   def old_action     headers["Status"] = "301 Moved Permanently"     redirect_to "http://dominio.com/"     end

Redirecciones en WordPress

Si tu página web está basada en WordPress estás de suerte, pues tienes una gran cantidad de plugins que pueden ayudarte a redireccionar páginas.
Uno de los más utilizados y mejor valorados es Redirection.
Sin embargo para una tarea como esta cualquier plugin cumple con la funcionalidad requerida.

Más Redirecciones

En la bibiografía al final puedes ver más sobre el tema o da clic a continuación:

Otros datos importantes

Que me encontré:

Aquí podemos ver el resto de "mamarachos", tablas explicando la terminología faltante en el presente artículo. Y sobre el Geotargeting.



Bibliografía:

Comentarios