Acortador de URL o URL shortner con PHP y mod_rewrite

Recientemente me encontré con el comentario de un colega en twitter donde recomendaba a un diario electrónico local la utilización de un acortador de url o url shortner como se conoce en ingles y decidí indagar cuales otros medios no utilizan acortadores en sus twits lo cual reduce considerablemente la cantidad de texto para los titulares y en realidad son unos pocos para la bondad del Internet.

A pesar de esto, si pude notar que todos los diarios locales utilizan servicios terceros para acortar sus url – aquellos que lo hacen – como bit.ly o goo.gl, en otros casos mediante herramientas de marcadores o social sharing que existen como tellafriend o sharethis.

En los diarios electrónicos y portales mas conocidos y que mantienen su identidad bajo las normas de conservar esta utilizan acortadores propios o self hosted lo cual me parece genial para poder identificar de que sitio proviene la url, ya que si algo nos ha dado negativo en cuanto a SEO, es que los servicios de url shortner o acortadores de url disminuyen en gran medida el posicionamiento debido a que vamos perniendo la colocacion de los url con nuestro dominio sustituyéndolos por los de estos servicios terceros.

UN ejemplo de un buen uso de este servicio es El Nuevo Diario de Puerto Rico (endi.com) cuyo servicio de acortar url es “end.pr” es cual no es mas que un mirror de bit.ly mediante API.

Vamos a crear un servicios para acortar url de manera que, podamos hostearlo en nuestros propio servidor que pueda ser de utilidad en conbinacion con un buen nombre de dominio, por ejemplo, si tenemos nuestro site con el dominio elcaribe.com; podemos crear un acortador de url con semejancia por ejemplo elcari.be que sería la extension de dominio de Bélgica per oque para nuestros fines es muy atractivo e identifica rapidamente la fuente del url acortado elcaribe.com.

Esta guia y código a continuación ha sido tomada y traducida del sitio web http://net.tutsplus.com/tutorials/other/using-htaccess-files-for-pretty-urls/ donde podrás encontrar el artículo orginial que tomado como fuente.

Primero vamos a conocer los archivos que utilizaremos y la estrucura de archivos de nuestro servicio de url shortner o acortador de url:

.htaccess: redirecciona todos los url hasta serve.php
create.php: valida la URL, crea el codigo corto, salva el codigo corto en la Base de Datos
css/style.css: hoja de estilo, para ponerlo bonito
db_config.php: para lamacenar las variables de conección a la db y cualquier otra infromacion que podríamos utilizar
index.php: la cara del servicio donde introducimos la url a acortar
serve.php: convierte el rquest de un codigo corto y lo redireccionana a la url original.

Antes de continuar vamos a crear la tabla que almacenara nuestros urls, crearemos una base de datos la cual llamaremos “shrtr” y ejecutamos el siguiente SQL:

CREATE TABLE IF NOT EXISTS url_redirects (
id int(11) NOT NULL auto_increment,
short varchar(10) NOT NULL,
url varchar(255) NOT NULL,
created_at timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY short (short) )
ENGINE=MyISAM DEFAULT CHARSET=utf8;

Acortador de Url o Url Shortner

Ahora que tenemos la estructura y tabla necesaria para nuestro servicio vamos a crear los archivos y el código necesario en cada uno para que nuestro servicio de acortar url o url shortner funcione:

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Makes URLs Shrtr</title>
<link type="text/css" rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div id="pagewrap">
<h1>shrt<span>r</span>.me</h1>

<div>
<form action="./create.php" method="post">

<span>Type your URL here</span>
<input name="url" type="text" />
<input type="submit" value="shrtr" />
</form>
</div>
</div>
</body>
</html>

css/style.css


@charset "utf-8";
/* reset */
* {
font-family: Helvetica, sans-serif;
margin: 0;
padding: 0;
}

/* site */
html, body { background-color: #008AB8; }
a { color: darkblue; text-decoration: none;}

#pagewrap {
margin: 0 auto;
width: 405px;
}

h1 {
color: white;
margin: 0;
text-align: center;
font-size: 100px;
}
h1 .r { color: darkblue; }

.body {
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
background-color: white;
text-align: center;
padding: 50px;
height: 80px;
position: relative;
}

.body .instructions {
display: block;
margin-bottom: 10px;
}
.body .back {
right: 15px;
top: 10px;
position: absolute;
}

.body input[type=text] {
display: block;
font-size: 20px;
margin-bottom: 5px;
text-align: center;
padding: 5px;
height: 20px;
width: 300px;
}

db_config.php


<?php

$database = "shrtr";
$username = "user";
$password = "pass";
$host     = "localhost";

?>

create.php


<?php
require("./db_config.php");

$url = $_REQUEST['url'];

if(!preg_match("/^[a-zA-Z]+[:\/\/]+[A-Za-z0-9\-_]+\\.+[A-Za-z0-9\.\/%&=\?\-_]+$/i", $url)) {
$html = "Error: invalid URL";
} else {

$db = mysql_connect($host, $username, $password);

$short = substr(md5(time().$url), 0, 5);

if(mysql_query("INSERT INTO `".$database."`.`url_redirects` (`short`, `url`) VALUES ('".$short."', '".$url."');", $db)) {
$html = "Your short URL is<br />shrtr/".$short;
} else {
$html = "Error: cannot find database";
}

mysql_close($db);
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Makes URLs Shrtr</title>
<link type="text/css" rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div id="pagewrap">
<h1>shrt<span>r</span>.me</h1>

<div>
<?= $html ?>
<br /><br />
<span><a href="./">X</a></span>
</div>

</div>
</body>
</html>

Acortador de url o Url Shortner

serve.php



<?php
require("./db_config.php");

$short = $_REQUEST['short'];

$db = mysql_connect($host, $username, $password);
$query = mysql_query("SELECT * FROM `".$database."`.`url_redirects` WHERE `short`='".mysql_escape_string($short)."' LIMIT 1", $db);
$row = mysql_fetch_row($query);

if(!empty($row)) {
Header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$row[2]."");
} else {
$html = "Error: cannot find short URL";
}

mysql_close($db);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Makes URLs Shrtr</title>
<link type="text/css" rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div id="pagewrap">
<h1>shrt<span>r</span>.me</h1>

<div>
<?= $html ?>
<br /><br />
<span><a href="./">X</a></span>
</div>

</div>
</body>
</html>

.htaccess



Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(\w+)$ ./serve.php?short=$1

Para probar entramos a nuestro nuevo servicio vía navegador entrando a http://localhost/ o el dominio en el servidor si está en la raíz de nuestro servidor o http://shrtr/ como lo hice utilizando un vhost en apache.

Con estos pocos archivos y líneas de código podemos tener nuestro propio sistema de acortador de url para aquellos sitios que no utilizan los mismos para acortar sus twits. De igual forma podemos crear simplemente el servicio en sí, y que esta sea uno mas de los muchos que hay. Sin embargo, la idea principal de este ejemplo es que los diarios electrónicos portales y cualquier otro site pueda tener este servicio propio y que permita mantener la identidad de dominio o fuente de la información como mencioné la inicio de este artículo.

Espero les se de utilidad, y recuerden…. CODE IS POETRY!