domingo, 26 de octubre de 2014

[HTACCESS] URL's Amigables

Bienvenidos a este tutorial, bueno la verdad es que no tenia ganas de postear nada de esto por que hay una gran cantidad de tutoriales en la web sobre lo mismo, pero se que a algunos les sera de utilidad este minitutorial.

Las URLs amigables nos son útiles para el SEO, de manera que nos encuentren mas rápido en los resultados de algún buscador, tambien nos es útil cuando nos quieren atacar ya que casi siempre y por no decir siempre atacan a paginas PHP que incluyen parámetros y al utilizar dorks también realizan lo mismo.

La finalidad de este tutorial es llegar a una URL como la siguiente:

http://localhost/mod_rewrite2/noticia/2/"blackhat"€-rompe-el-mito-del-"€œhacker".html
Dejándonos algo como lo siguiente:


 Sin mas comencemos...

Antes que todo debemos estar seguros que en nuestra configuración de PHP tengamos habilitado el modulo mod_rewrite de apache, ya que sin el no seremos capaces de sobreescribir nuestras urls.

Debemos tener activado también la directiva AllowOverride para que nos permita realizar redirecciones. Al igual que también debemos activar FollowSymlinks el cual sigue enlaces simbolicos (recuerden que esta directiva nos puede tambien causar problemas de seguridad, pero esto si llegasen a entrar al servidor).

De manera que en nuestro archivo de configuracion de apache (lo puedes verificar con la función phpinfo() si no tienes idea de cual es), debería quedar de la siguiente manera:



La parte mas importante de aqui es el archivo de configuración .htaccess al cual le agregaremos la expresion regular para que nos rediriga a donde queremos.


RewriteEngine On
RewriteBase /mod_rewrite2/
RewriteRule ^noticia/([0-9]*)/(.*)\.html$ index.php?id=$1&titulo=$2 [L]

En el caso siguiente tengo mi archivo .htaccess. Explicare que hace cada cosa.
RewriteEngine On - Activamos el motor de sobreescritura de URLs
RewriteBase /mod_rewrite2/ - Con esto le especifico que quiero que de esta carpeta comienze la sobreescritura de URLs
RewriteRule ^noticia/([0-9]*)/(.*)\.html$ index.php?id=$1&titulo=$2 [L] - Le doy una regla, donde todo lo que coincida con la expresion regular sea sobreescrito. Para entender mejor esto podemos utilizar la herramienta:

http://www.regexr.com/

  
Con esto nos daremos cuenta fácilmente que nuestra expresión regular coincide perfectamente con el tipo de URL que queremos construir. Como en esta parte no trataremos las expresiones regulares les recomiendo que se pasen por: http://arthusu.blogspot.mx/2013/07/phpexpresiones-regulares-pcre.html

Lo que sigue que es index.php?id=$1&titulo=$2 [L] con $1 y $2 hacemos referencia a los grupos de expresiones regulares donde $1 es el primer grupo ([0-9]*) y $2 es el segundo grupo (.*). Esto si coinciden las expresiones regulares en index.php?id=1&titulo=este es mi titulo nos devuelve la noticia correctamente. Con la bandera L detenemos el proceso de verificación de esta manera solo lo realiza y no gastamos mas recursos.

Un  excelente generador de redirecciones que les puede servir es:
http://www.generateit.net/mod-rewrite/index.php

Por ultimo tenemos nuestro codigo PHP:


<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
</head>
<body>
<?php
 error_reporting(0);
 function urls_amigables_decodificar($url) {
  $url = strtolower($url);
  $url = str_replace ('-', ' ', $url);
  return $url;
 }
 function urls_amigables_codificar($url){
  $url = strtolower($url);
  $find = array('á','é','í','ó','ú','ñ');
  $repl = array('a','e','i','o','u','n');
  $url = str_replace($find, $repl, $url);
  $url = str_replace(' ', '-', $url);
  return $url;
 }

 $con = mysqli_connect('localhost','arthusu2','12345','noticias');
 mysqli_set_charset($con,"utf8");

 if(isset($_GET['id']) && isset($_GET['titulo'])){
  $titulo = urls_amigables_decodificar($_GET['titulo']);
  $id = $_GET['id'];
  
  $id = mysqli_real_escape_string($con,$id);
  $titulo = mysqli_real_escape_string($con,$titulo);
  $q = "SELECT * FROM noticias WHERE id='$id' AND titulo='$titulo'";
  $result = mysqli_query($con,$q);
  while ($array = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
   echo "<title>".$array['titulo']."</title>";
   echo "<h2>{$array['titulo']}</h2>";
   echo $array['noticia'];
  }
 }else{
  $q = "SELECT * FROM noticias ORDER BY id DESC";
  $result = mysqli_query($con,$q);
  while ($array = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
   echo "<title>Inicio</title>";
   echo "<h2>{$array['titulo']}</h2>";
   echo $array['noticia'];
   echo "<br>";
   echo '<a href="noticia/'.$array['id'].'/'.urls_amigables_codificar($array['titulo']).'.html">Ir al vinculo</a>';
  }
 }
 mysqli_close($con);

?>
</body>
</html>

En este caso estoy trabajando con una base de datos. Selecciono las noticias por id y titulo, si coincide las arroja.

En caso de que no existan los valores id y titulo por el método GET me muestra todas las noticias.

Al final del archivo se genera un enlace e incluimos dos funciones aquí: 
Cuando codificamos la url le agregamos - (guiones) a los espacios y le quitamos los acentos a los caracteres. Cuando decodificamos le quitamos los - (guiones) y en minúsculas.

No importa mucho los caracteres por que en mysql le especifico un charset utf8 que soporta acentos, y también en la meta para que al mostrar me muestre los datos correctamente.

Por ultimo comentarles que la base de datos esta estructurada de esta manera:


 A lo cual solo insertamos datos.

Se me hace algo bastante tedioso explicar todo esto, ya que deje algunas partes de tutoriales de PHP y tambien sobre PHP PCRE. Por lo cual es demasiado facil, solo activar el modulo poner las reglas en el .htaccess y correr nuestro script.

Las noticias las inserte mediante el administrador phpmyadmin.

Mas que nada esto no seria un tutorial sino algo que muestro, saludos.

No hay comentarios:

Publicar un comentario