FriendlyURLA la hora de crear una web dinámica accesible, una de las primeras cosas a pensar para el buen uso de las paginas generadas, es poner fácil el acceso a las direcciones URL del sistema. Esto quiere decir que, en vez de poner caracteres especiales como interrogaciones o variables podemos poner texto simple de leer basado en barras, guiones y texto plano sin caracteres especiales. Al conjunto de esta técnica se le denomina FriendlyURL.

Para utilizar esta técnica utilizaremos un truco que nos brinda la configuración de directorios de los servidores Apache y mi lenguaje preferido, PHP.
Lo que realizaremos será crear un archivo llamado .HTTACCESS en el directorio a "virtualizar", el cual sera el inicio de las "URL amigables". Este archivo hace que al introducir unos parámetros en la dirección, estos sean remitidos a una pagina PHP, en nuestro caso index.php, alojada en el mismo directorio. Este archivo procesara la dirección y nos dará los valores captados de la URL como si de una consulta de un GET o un POST se tratara, a partir de los cuales realizaremos lo que necesitemos.

Para agilizar todo ese proceso he creado 3 funciones a partir de las que implementaremos de una manera simple y rápida las FriendlyURL.

La función htaccess() genera el archivo de configuración necesario para actuar en el registro. La función tiene una variables de personalización para poder determina el lugar donde colocaremos el el archivo generado (archivo que sera el puto de partida de la virtualización de las FriendlyURL). Si no se modifica esa variable el archivo se crea en el mismo directorio donde se encuentre el archivo que la ejecute.

PHP:
  1. function htaccess($path = './'){
  2.     $nombre  = $path.'.htaccess';
  3.     if(!is_file($nombre)){
  4.         $httaccess  = array(
  5.             '<IfModule mod_rewrite.c>',
  6.             '   RewriteEngine On',
  7.             '   RewriteCond %{REQUEST_FILENAME} !-d',
  8.             '   RewriteCond %{REQUEST_FILENAME} !-f',
  9.             '   RewriteRule ^(.*)$ index.php/$1 [QSA,L]',
  10.             '</IfModule>'
  11.         );
  12.         $fp  = fopen($nombre,'w+');
  13.         $read   = fwrite($fp, implode("\n", $httaccess), 1024);
  14.         fclose($fp);
  15.     } else {
  16.         $read = true;
  17.     }
  18.     return $read;
  19. }

La función friendlyurl() da como resultado un array que indica la dirección actual (BASE), el string de variables añadidas (DATOS) y un array de las variables en modo FriendlyURL (DIR).

PHP:
  1. function friendlyurl(){
  2.     if($_SERVER['PATH_INFO'] != ){
  3.         $dir['BASE']    = explode($_SERVER['PATH_INFO'], $_SERVER['REQUEST_URI']); $dir['BASE'] = $dir['BASE'][0];
  4.         $dir['DATOS']   = substr($_SERVER['REQUEST_URI'], strlen($dir['BASE']));
  5.         $corte_del_get  = strpos($dir['DATOS'], '?') ? strpos($dir['DATOS'], '?') : null;
  6.         $dir['DIR']  = substr($dir['DATOS'], 0, $corte_del_get);
  7.         if(pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_EXTENSION) == ){
  8.             $dir['DATOS']   = explode(basename(__file__).'/', $_SERVER['REQUEST_URI']);
  9.             if(is_array($dir['DATOS'])){
  10.                 array_shift($dir['DATOS']);
  11.                 $dir['DATOS']   = implode(, $dir['DATOS']);
  12.             }
  13.         } else {
  14.             $dir['DATOS']   = substr($_SERVER['REQUEST_URI'], strlen(pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME).'/'));
  15.         }
  16.         $dir['DIR']  = (substr($dir['DIR'], -1, 1) == DIRECTORY_SEPARATOR) ? substr($dir['DIR'], 0, -1) : $dir['DIR'];
  17.         if(strpos($dir['DATOS'], '?')){
  18.             $corte_del_get  = strpos($dir['DATOS'], '?') ? strpos($dir['DATOS'], '?') : null;
  19.             $dir['DIR']  = substr($dir['DATOS'], 0, $corte_del_get);
  20.         } else {
  21.             $dir['DIR']  = $dir['DATOS'];
  22.         }
  23.        
  24.         $dir['DIR']  = str_replace ('-', ' ', $dir['DIR']); //reemplazo
  25.         if($dir['DIR'] != ){
  26.             $dir['DIR'] = explode(DIRECTORY_SEPARATOR, $dir['DIR']);
  27.             if($dir['DIR'][count($dir['DIR'])-1] == ){ unset($dir['DIR'][count($dir['DIR'])-1]); }
  28.         } else {
  29.             $dir['DIR'] = array();
  30.         }
  31.         if(!is_dir($dir['DIR'])){ array_shift($dir['DIR']); }
  32.     } else {
  33.         $dir    = array( 'BASE' => $_SERVER['REQUEST_URI'], 'DATOS' => , 'DIR' => array());
  34.     }
  35.     return $dir;
  36. }

La función traduccionURL() da como resultado la URL que introducimos en la primera variable, pero con el formato especifico de FriendlyURL, de manera que cambia los caracteres especiales, los espacios….

PHP:
  1. function traduccionURL($url) {
  2.     $url = strtolower($url);                                                                            #Pasar a minusculas
  3.     $url = str_replace(array('á', 'é', 'í', 'ó', 'ú', 'ñ'),   array('a', 'e', 'i', 'o', 'u', 'n'), $url);    #Caracteres especiales latinos
  4.     $url = str_replace(array(' ', '&', '\r\n', '\n', '+')'-', $url);                           #Conversion
  5.     $url = preg_replace(array('/[^a-z0-9\-<>]/', '/[\-]+/''/<[^>]*>/'), array(, '-', ), $url)#Caracteres especiales
  6.     return $url;
  7. }

El siguiente ejemplo detecta si el archivo .htaccess existe en el directorio actual, y si no es así lo crea. En la segunda linea representamos todos los datos obtenidos en la dirección.

PHP:
  1. if(is_file('./.htaccess')){ htaccess('./'); }
  2. $variables =friendlyurl();
  3. print_r( $variables );