Sei sulla pagina 1di 27

¿Qué son las URL amigables?

No se muy bien como explicarlo, pero mejor te muestro un ejemplo: Esto NO es una URL
amigable.

http://un.blog/articulo.php?id=123

Esto SI lo es

http://un.blog/articulo/123

Estas URL son mas fáciles de utilizar y recordar.


Hoy te enseñare como crearlas.

Para empezar, se necesita crear un archivo .htaccess; dentro del cual colocaremos solo
unas pocas lineas para nuestro ejemplo, este a su vez solo funciona en un hosting o
servidor local (apache).
Con este archivo htaccess lo que podemos hacer es manipular las URL solicitadas al
servidor.

Para empezar crearemos dos archivos PHP, uno llamado index.php y otro articulo.php.
Dentro del index.php solo agregaremos algunos enlaces a nuestro articulo.php.

index.php
PHP:

<a href="articulo/123">Ver articulo "123"</a>


<a href="articulo/456">Ver articulo "456"</a>
<a href="articulo/789">Ver articulo "789"</a>

Puedes ver que el enlace ya es una URL amigable, ahora crearemos nuestro archivo
htaccess y dentro escribiremos lo siguiente:
IMPORTANTE: El nombre del archivo en si es .htaccess, no debe de llevar nada mas,
simplemente crea un archivo en tu directorio raíz y guardarlo con ese nombre, no olvides
el punto antes del htaccess.

.htaccess
Código (Text):

RewriteEngine on
RewriteRule ^articulo/(\w+)$ articulo.php?id=$1

Expliquemos el código.

 RewriteEngine on: Esto sirve para que el servidor nos permita reescribir la URL
 ^: Significa el comienzo de la re-escritura
 articulo: Significa que la URL solicitada comienza con articulo/
 (\w+): Esto almacena cualquier valor que este después del / y lo guarda en $1
 $: Significa el final de la re-escritura
 articulo.php?id= Indica a donde se re-escribirán los datos anteriormente
guardados
 $1: Es el valor almacenado previamente
Es algo confuso, pero por ejemplo, cuando alguien ingrese
a http://un.blog/articulo/123 lo que escribimos previamente lo interpretara como si
fuera http://un.blog/articulo.php?id=123, porque asi lo definimos nosotros.
También es importante que cada URL que queremos reescribir se deberá agregar debajo
del anterior, por ejemplo:

Código (Text):

RewriteEngine on
RewriteRule ^articulo/(\w+)$ articulo.php?id=$1
RewriteRule ^autor/(\w+)$ autor.php?id=$1

Ahora veamos en el archivo articulo.php, este realmente no cambiara mucho, para


nuestro ejemplo solo recibimos el id del articulo y lo mostramos (simple).

articulo.php
PHP:

<?php
echo "Estas en el articulo: " . $_GET["id"]

Una parte fundamental e imprescindible de las técnicas SEO es la de generar URLs


amigables. Estas nos permiten recordar más fácilmente una URL y, además, permiten
a los spiders de google posicionarte mejor.

¿Que es una URL amigable?

Una URL amigable es aquella que detalla de forma precisa el contenido de la página y
es perfectamente entendible para los ojos de un usuario inexperto. Pongamos un
ejemplo:

Esto NO es una url amigable: www.tudominio.es/cargarNoticia.php?id=12

Esto SI es una URL amigable: www.tudominio.es/esta-es-una-noticia-de-prueba

Como podéis ver la diferencia es notable. Mientras que en la primera simplemente


vemos cómo se llama a una página "cargarNoticias.php" y se le pasa un "id", en la
segunda vemos como en la propia URL añadimos el título de la noticia "esto-es-una-
noticia-de-prueba"

Como habréis intuido ya, es mucho mejor una URL del segundo tipo que del primero y
google asi lo entiende.

Además es uno de los factores que más valora google a la hora de posicionar una
página.
¿Cómo podemos generar URL amigables?

Para generar este tipo de URL amigables tenemos que hacerlo a través de un fichero
llamado ".htaccess" que, mediante una serie de reglas y expresiones regulares, nos
permite configurar los redireccionamiento o enmascaraciones de URLs adecuados.

Configurando mi servidor

Para que el fichero .htaccess funcione correctamente debemos asegurarnos que


nuestro servidor APACHE tenga habilitado el modo de reescritura de URL. Para ello
haremos lo siguiente:

1º Debemos tener activo el módulo mod_rewrite de apache. En el


fichero "httpd.conf" deberíamos tener algo como esto: LoadModule rewrite_module
modules/mod_rewrite.so . Aseguraros de que no esté comentado con #. Por lo
general viene habilitado.

2º Debemos permitir la reescritura de URLs en el servidor. Para ello, en el mismo


fichero "httpd.conf"deberíais tener algo como lo siguiente:

1
<Directory />
2
3 Options FollowSymLinks
4
5 AllowOverride All
6
7 Order deny,allow
8
9 Allow from all
10
Satisfy all
11
12 </Directory>
13

Esta estructura suele venir aunque a veces viene con algunas líneas a "deny".
Cambiadlas y ponedlas a "allow".

3º Por último debéis crear el fichero .htaccess en la raiz de vuestro proyecto. Fijaros
que es un fichero sin extensión.

Con estas 3 simples pasos tendríais habilitadas las URL amigables y , ya, solo os
quedaría generar las reglas de reescritura que vosotros queráis.

Ejemplos de .htaccess

A continuación, vamos a ver unos ejemplos simples pero que sin duda serán de los
que más utilicéis ya que las URL amigables suelen ser siempre muy parecidas.
Dentro de vuestro fichero .htaccess debéis escribir lo siguiente:

1º Vamos a hacer que al escribir noticia/esto-es-una-noticia-de-prueba_13 nos mande


a cargarNoticia.php?id=13 y se vea como noticia/esto-es-una-noticia-de-prueba_13

1 RewriteEngine On
2
3 RewriteRule ^noticia/(.+)_([0-9]+)$ cargarNoticia.php?id=$2

2º Vamos a hacer que al escribir noticia/esto-es-una-noticia-de-prueba te mande a


cargarNoticia.php?id=esto-es-una-noticia-de-prueba y se ve producto/esto-es-una-
noticia-de-prueba

1 RewriteEngine On
2
3 RewriteRule ^noticia/(.+)$ cargarNoticia.php?id=$1

3º Vamos a hacer que al escribir home.html te mande hola.html y se vea home.html

1 RewriteEngine On
2
3 RewriteRule ^home.html hola.html

4º Vamos a hacer que al escribir home.html te mande a http://www.google.com y se


vea http://www.google.com

1 RewriteEngine On
2
3 redirectMatch 301 /home.html http://www.google.com

5º Vamos forzar a que tu dominio empiece por www, por ejemplo, si pones
http://tudominio.com te redirecciona a http://www.tudominio.com

1 RewriteCond %{HTTP_HOST} ^tudominio.com [NC]


2
3 RewriteRule ^(.*)$ http://www.tudominio.com/$1 [L,R=301]

Espero que os sea de utilidad y, ya sabéis, las URLs amigables haran que vuestra
web salga más arriba en los buscadores.

Todo el mundo quiere posicionar su sitio web en la primera página de resultados de los
principales buscadores. Hay muchos factores que influyen en el posicionamiento en
buscadores, y uno de ellos son las URLs legibles por humanos o URLs amigables. Una URL
amigable debe reflejar el contenido del sitio web o del blog.
Hay dos maneras de urls amigables en PHP. Una de ellas es utilizando el método
REQUEST_URI, y la segunda manera es a través del archivo .htaccess. En este tutorial, voy
mostraros como llevar a cabo las URLs amigables para vuestro blog o sitio web mediante el
archivo .htaccess. Puedes utilizar esta misma práctica para implementarlo en cualquier tienda
online.
Supongamos que tu sitio web ha sido desarrollado utilizando código PHP personalizado, es
decir, un desarrollo a medida. Por lo tanto, cada vez que se insertas una nueva entrada en tu
blog, la URL será generada de la siguiente manera:
www.yoursite.com/index.php?blog_id=1234
En este tutorial, vamos a cambiar la dirección de arriba por esta otra:
www.yoursite.com/my-seo-url/
Así que, cada vez que una persona visite la URL anterior, se generará el mismo contenido que
se genera cuando proporcionas el ID del artículo en la URL.

Paso 1: Cambios en la tabla


En primer lugar, tienes que modificar la tabla en la que se guarda el artículo. Crea una nueva
columna en ella y llámala seo-url.

Paso 2: Función para implementar urls amigables


Vamos a crear una función que generará las urls amigables por ti, basándonos en el título del
artículo.

function seo_url($vp_string){
$vp_string = trim($vp_string);
$vp_string = html_entity_decode($vp_string);
$vp_string = strip_tags($vp_string);
$vp_string = strtolower($vp_string);
$vp_string = preg_replace('~[^ a-z0-9_.]~', ' ', $vp_string);
$vp_string = preg_replace('~ ~', '-', $vp_string);
$vp_string = preg_replace('~-+~', '-', $vp_string);
$vp_string .= "/";
return $vp_string;
}

A la función anterior se le pasará el título del artículo como una cadena y devolverá la cadena
de la url amigable. Tal que así:
my-SEO-URL/
Tendrás que almacenar esta URL en la misma columna que hemos creado en el paso
anterior.

Paso 3: Cambios en el archivo .htaccess


Puesto que ya hemos generado una url amigable, debemos hacer algunos cambios en el
fichero .htaccess, ya que será el encargado de redirigir la nueva URL al contenido que se
guarda en la base de datos. Si no lo has creado, a continuación, crea un nuevo archivo de
texto plano y llámalo .htaccess. Ahora pega el siguiente código en él:
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(([A-Za-z0-9]+[-]+[A-Za-z0-9]+)+[/])$ index.php?blog_url=$1 [NC
,L] # Handle blog requests

Vamos a comprender paso por paso el anterior código:


La primera línea indica a Apache que vamos a reescribir ciertas reglas

RewriteEngine On

La segunda y tercera línea es una condición, que comprueba si la URL llamada es un archivo
o un directorio real. Si esta condición es cierta, no podrá reescribirse la URL.

RewriteCond %{SCRIPT_FILENAME} !-d


RewriteCond %{SCRIPT_FILENAME} !-f

Y la última línea es la reescritura de la URL. Así es cómo funciona: La cadena de después de


RewriteURL, es decir, "^ (([A-Za-z0-9] + [-] + [A-Za-z0-9] +) + [/]) $", es una expresión regular
que comprueba el trozo de URL de después de la barra “/", después del nombre de dominio
completo.
Ahora bien, si la URL se corresponde con la expresión regular, la URL enviada será redirigida
a index.php?blog_url=(url enviada), donde podremos manipularla en la variable blog_url.
Atención: Si tienes un error en el archivo .htaccess, obtendrá un error 500 en el
servidor.

Paso 4: Cambios en el archivo index


Ahora en el archivo index.php podrás obtener la url utilizando la variable $_GET['blog_url']. Ya
solo queda que consultes la tabla filtrando por la columna que acabamos de crear con ese
valor y podrás mostrar el artículo requerido rápidamente. Por ejemplo, en el archivo index.php
la consulta a la base de datos se llevará a cabo de la siguiente manera:

$url = $_GET['blog_url'];

$query = "SELECT articles.article_name,articles.article_content,categories.categ


ory_name,articles.img,users.u_fname,users.u_lname,DATE_FORMAT(articles.date,'%d
%b, %Y') as dates

FROM article

INNER JOIN users

ON users.user_id = article.user_Id

INNER JOIN articles

ON articles.article_id = article.article_id

INNER JOIN categories

ON categories.category_id = articles.category_id
WHERE articles.url = '$url'";

Por lo demás no tendrás que cambiar ni una coma de los otros archivos. Cuando ejecutes la
nueva URL, obtendrás el mismo contenido que obtenías cuando enviabas los identificadores
de los artículos por URL.

Muchos se preguntarán, ¿qué son las urls amigables y para qué sirven?, ¿realmente
son necesarias?.
Pongamos un ejemplo práctico para ver la importancia que tienen las urls amigables
dentro de un desarrollo web.
Si os fijais en un perfil de usuario de la popular red social Twitter, podéis ver que si
mi usuario es “sombeo_oficial“, puedo acceder rápidamente a mi perfil desde la
dirección “https://twitter.com/sombeo_oficial“. Eso amigos, es una url
amigable, algo rápido y sencillo para acceder a un contenido de la página (en este
caso al perfil del usuario) tanto para una persona como para un buscador.
Anteriormente, cuando surgió Facebook y se empezó a utilizar, los perfiles de los
usuarios no disponían de urls amigables, por lo que para acceder a un perfil de
usuario debíamos hacerlo a través de una url como esta
“http://www.facebook.com/profile.php?id=1304880680“, algo que como podéis
ver no es nada sencillo de recordar para una persona, ni tampoco muestra
información muy concreta para un buscador.
Actualmente Facebook ya utiliza urls amigables y podemos ver que para acceder a
un perfil de usuario ya símplemente con poner su nombre de usuario accedemos a él,
sería algo así “http://www.facebook.com/sombeo” tanto para perfiles, como
páginas, eventos, etc.
Para el posicionamiento de un sitio web es muy importante tener las direcciones o
urls de forma amigable para los buscadores. Lo que incrementará considerablemente
nuestro tráfico por parte de éstos. Ya que los buscadores además de fijarse en el
título de la página, descripción, etcétera, también se fijan en la url y no es lo mismo
tener una url amigable que diga “http://www.miweb.com/productos/monitor-17-
pulgadas-samsung” a que sea “http://www.miweb.com/producto.php?id=2154“.
Después de esta explicación, empecemos:
Primero necesitamos limpiar éstas direcciones de carácteres inválidos como las
tíldes, eñes y demás carácteres especiales. Para ello podemos utilizar la siguiente
función PHP:
1
2 function urls_amigables($url) {
3
4 // Tranformamos todo a minusculas
5
6 $url = strtolower($url);
7
8 //Rememplazamos caracteres especiales latinos
9
$find = array('á', 'é', 'í', 'ó', 'ú', 'ñ');
10
11 $repl = array('a', 'e', 'i', 'o', 'u', 'n');
12
13 $url = str_replace ($find, $repl, $url);
14
15 // Añadimos los guiones
16
17 $find = array(' ', '&', '\r\n', '\n', '+');
18 $url = str_replace ($find, '-', $url);
19
// Eliminamos y Reemplazamos otros carácteres especiales
20
21 $find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
22
23 $repl = array('', '-', '');
24
25 $url = preg_replace ($find, $repl, $url);
26
27 return $url;
28
}
29
30
Esta función la usaremos a la hora de crear los enlaces en nuestra página web,
para evitar posibles problemas.
Ahora vamos con lo importante, deberemos crear un archivo de texto
plano .htaccess en el directorio raíz con una estructura específica, para que nuestro
servidor Apache sepa como interpretarlo.
 La primera línea de este archivo debe ser la siguiente:
1 RewriteEngine on
 Después ponemos las dos siguientes líneas:
1 RewriteCond %{SCRIPT_FILENAME} !-d
2 RewriteCond %{SCRIPT_FILENAME} !-f

Estas dos líneas son muy importantes, lo que hacen es decirle a Apache que sólo
puede crear direcciones amigables si el directorio especificado no existe. Esto evita
por ejemplo las reglas que coincidan con “http://miweb.com/imagenes/logo.png“.
La primera línea evita los directorios (!-d) y la segunda línea los archivos (!-f).
 Ahora vamos a reescribir una dirección para hacerla amigable.

Tenemos la siguiente dirección:


1 index.php?seccion=php&articulo=3

Podemos hacerla amigable y quedaría así:


1 articulo/php/3/urls-amigables-con-htaccess-y-php
Pues para poder crear está dirección amigable, a continuación de la última línea que
tenga el archivo .htaccess deberemos poner una regla, en el caso de la dirección
anterior sería ésta:
1 Rewriterule ^articulo/(.+)/([0-9]+)/(.+)$ index.php?seccion=$1&articulo=$2

Expliquemos un poco que significa cada cosa:


 Rewriterule significa que vamos a crear una regla para reescribir una
dirección.
 El carácter ^ significa el comienzo de la expresión.
 El primer valor (.+) significa que ahí va el primer valor/variable que pasamos
por la urlcon el método GET. A estas variables se las llaman $1, $2, $3,
dependiendo de su posición.
 El valor ([0-9]) indica que ahí puede ir cualquier número
del 0 al 9 pudiéndose repetir todas las veces que sean necesarias.
 El segundo valor (.+) hace lo mismo que el primero pero con la última posición
de la dirección.
 El carácter $ significa que ahí termina la expresión.
Podemos hacer un infinidad de reglas distintas con diferentes patrones
utilizando expresiones regulares.
Entonces cuando en el código de mi página web vaya a crear un enlace lo haría
poniendo la url amigable directamente. Antes de todo ésto, cuando hagamos por
ejemplo la consulta a la base de datos, mostraremos alguno de estos datos en la url
para crear nuestra url amigable.
La consulta sería algo así:
1 SELECT id, titulo, descripcion, seccion FROM productos WHERE id = 3
Después de hacer la consulta desde PHP y devolver los valores quedaría algo así:
1 //recibo los valores de la consulta en diferentes variables
$seccion = $row['seccion'];
2 $id_articulo = $row['id'];
3
4 //limpiamos el título con la función que hay al comienzo del artículo
5 $titulo = urls_amigables($row['titulo']);
6
7 echo '<a href="articulo/'.$seccion.'/'.$id_articulo.'/'.$titulo.'" title="'.$row["tit
8
Esto crearía nuestra url amigable utilizando los valores que tenemos en nuestra base
de datos.
Para evitar problemas con la raíz al utilizar las urls amigables con direcciones
relativas, es recomendable utilizar el siguiente código dentro del “<head>” de
nuestra página:
1 <base href="http://www.miweb.com/" />

Y listo, con todo esto ya tendríamos nuestras urls amigables funcionando


correctamente. Ya saben, cualquier duda tan sólo pregunten.

El archivo .htaccess es un archivo de configuración de Apache, el más popular de los


servidores web, que se encuentra en la mayoría de los espacios de alojamiento. De modo
general, ese archivo es capaz de alterar la configuración del servidor web, aplicando esos
cambios al directorio donde el .htaccess esté situado y todos los directorios que dependen de
él.
En la práctica, este fichero se usa para muchas cosas como, por ejemplo, proteger una carpeta
por clave, activar la compresión de los ficheros que se transfieren, etc. En este artículo
profundizamos en uno de los mejores usos que le podemos destinar: la creación de URL
amigables.
Las URL amigables son básicamente direcciones de páginas que son más fáciles de escribir,
recordar y sobre todo, que Google interpreta de con mayor relevancia. Por ejemplo, podríamos
tener una URL como: example.com/tienda.php?productos=zapatillas&categoria=playa, pero es
una URL poco atractiva para buscadores y usuarios, aparte que muestra nuestra
programación. Sería mucho mejor una URL como esta:
example.com/productos/zapatillas/playa.
Es una dirección más concisa, fácil de escribir y que se centra en lo que realmente importa,
sin mostrar el contenido de las variables que se usan a nivel de programación.

Cómo crear URLs amigables

Esta tarea básicamente se trata de configurar un sistema de redirecciones para que, de la


URL amigable, internamente y de manera transparente para el usuario, se transfiera la
solicitud a la página real que la va a servir. Es decir: es como una traducción de la URL
amigable a la URL no amigable.
Lo haremos, como decíamos, gracias al archivo .htaccess. Primero tenemos que crear ese
archivo y guardarlo generalmente en la carpeta raíz del dominio. El .htaccess es un archivo de
texto plano, que tendremos que editar.
Para comenzar debemos indicar que se ponga en marcha el motor de reescritura de URL con
esta línea:

RewriteEngine on
Luego tenemos que generar las redirecciones con la instrucción RewriteRule, indicando
primero el patrón de la URL amigable y la redirección que se debe producir. Dicho patrón se
debe colocar como una expresión regular y a continuación colocamos la URL a la que se debe
redirigir la solicitud.

RewriteRule ^productos/([a-zA-Z]+)/([a-zA-Z]+)$

tienda.php?productos=$1&categoria=$2
Para explicar esta regla, la vamos a descomponer:
o “^” es el inicio de una expresión regular para definir el patrón de URL amigable
o “productos/” es una serie de caracteres que figurarán en toda URL que se desee redirigir.
o “([a-zA-Z]+)” eso es una expresión regular que dice que habrá una o más repeticiones de letras,
minúsculas o mayúsculas
o “/” hay un separador de barra entre las dos repeticiones
o “([a-zA-Z]+)” vuelve a figurar el patrón de repeticiones de letras.
o “$” es el final del patrón.
A partir de ahí encontramos la URL a la que redirigimos la solicitud. Que estará en el
archivo tienda.php, enviándole como parámetros “productos” y “categoria”. $1 corresponde con
el primer patrón “([a-zA-Z]+)” y $2 con el segundo, tal como están indicados en la expresión
regular.
Este sería otro ejemplo completo de modificación del archivo .htaccess que puede ayudarnos a
crear URL amigables para distintos productos:

# Activar RewriteEngine

RewriteEngine on

RewriteCond %{SERVER_PORT} 80

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME}.php -f

# Reescribir la URL solicitada por el usuario


# Home

RewriteRule ^inicio$ /index.php [L]

# Producto

# Entrada: producto/NOMBRE_PRODUCTO/

# Salida: productos.php?id=NOMBRE_PRODUCTO

RewriteRule ^producto/(.*)$ /productos.php?id=$1 [L]


La verdad es que el .htaccess para el tema de redirecciones da para mucho más de lo que
hemos visto, pero con esto nos podemos hacer una idea muy buena de cómo funciona y
seguro que tendremos en la cabeza ideas frescas que implementar en nuestros sitios alojados
en el servidor web Apache.

Un archivo .htaccess (hypertext access) o archivo de configuración distribuida es un archivo en


formato ASCIIcomo el que cualquiera puede crear con el bloc de notas, popularizado por el Servidor
HTTP Apache, que es el más usado en el mundo cuando hablamos de servidores Web. Permite definir
diferentes directivas de configuración para cada directorio (con sus respectivos subdirectorios) sin necesidad
de editar el archivo de configuración principal de Apache.

Cuando hablamos de “directivas” nos referimos a la terminología que usa Apache para los comandos que se
usan para los archivos de configuración.

Los archivos .htaccess son usados frecuentemente para especificar restricciones de seguridad para un
directorio en particular, de aquí el sufijo “access“. Los servidores suelen usar el .htaccess para reescribir
URLs largas y complejas, en otras más simples y fácilmente recordables, permiten bloquear a usuarios por su
dirección IP y/o dominio, bloquear bots y arañas web. También permite controlar las páginas de errores
cuando estos ocurren del lado del servidor.

Al momento de crear un .htaccess se debe recordar que este no tiene una extensión como cualquier otro
archivo, se debe guardar en modo ASCCI y no en binario. Programas como el bloc de notas tienden a
agregarle automáticamente la extensión .txt pero hay que quitarla. Otro punto a tener en cuenta es que el
archivo debe tener permisos de lectura-escritura-ejecución (CHMOD) 644. Con esto hacemos que el archivo
pueda ser usado por el servidor pero se previene que sea accedido a través del navegador. Más adelante
veremos que el .htaccess también puede ser protegido mediante un par de lineas.

Los .htaccess están habilitados por defecto, pero se puede dar el caso en que no lo esté. Este
comportamiento se controla a través de la directiva AllowOverride que se encuentra en el archivo de
configuración httpd.conf
Gracias al .htaccess podemos controlar el comportamiento de nuestro sitios y aplicaciones Web para que
estos sean un poco más seguros, hacer redirecciones, crear mensajes de error más personalizados, restringir el
acceso a determinadas carpetas, evitar que se listen directorios específicos, etc.

El .htaccess por lo general siempre estará ubicado en el directorio raíz de nuestros sitios Web, también
puede estar ubicado en directorios específicos dentro de un servidor Web pero por regla general, debería
existir uno en todo directorio raíz.

Hay que tener en cuenta que al tener habilitado y configurado el archivo .htaccess, este tendrá un impacto
negativo en nuestro sitio Web. La razón de esto es que cada vez que se haga una petición, se buscará en cada
directorio posible si existe un archivo .htaccess, y de ser así se ejecutará cada directiva dentro de el. Esto
genera cierta carga adicional a un sitio Web y puede degradar su performance

El archivo .htaccess tiene muchas posibilidades, pero visto desde el punto de vista de la seguridad,
mencionemos algunas opciones a la hora de configurarlo:

1. Evitar que se liste el contenido de un directorio:


Si no tenemos restricciones al momento de listar el contenido de cualquier directorio, este mostrará todo lo
que tenga, por ejemplo si tenemos una carpeta llamada “imágenes” en nuestro sitio Web y escribimos
directamente su URL en el navegador http://www.tusitio.com/imagenes/ nos mostrará su contenido. Si
queremos evitar este tipo de comportamiento podemos usar las directivas Options All -
Indexes dentro del .htaccess para evitar que se liste cualquier directorio.

Supongamos que tienes una carpeta llena de eBooks y no quieres que se acceda directamente a ella, pues con
la directiva IndexIgnore * lo puedes hacer. El comodín “*” indica que tome en cuenta todos los archivos
dentro de una carpeta específica.

Imaginemos ahora que por alguna razón desea permitir que se listen solo archivos HTML pero ninguno que
sea .pdf o .doc, la directiva a usar sería IndexIgnore *.pdf *.doc.

En caso contrario, si lo que se desea es permitir que se listen los directorios, sería suficiente con poner
un .htaccess con la directiva Options +Indexes en el directorio que se quiera.

2. Evitar el acceso de archivos y carpetas


Esto resultaría muy útil cuando queremos proteger archivos críticos, como los archivos de configuración. Un
ejemplo de esto podría ser:

<files archivo-configuracion.php>

order allow,deny

deny from all

</files>

Con esto evitamos que acceda directamente al archivo archivo-configuracion.php vía Web.
Un modo de proteger al mismo .htaccess podría ser:

<files .htaccess>

Order allow,deny

Deny from all

</files>

En el caso de las carpetas críticas o de cualquier otra también es igual. Una forma de evitar el acceso a ciertas
carpetas podría ser redireccionandolas a la página principal del sitio Web, esto se conoce como
redireccionamiento 301 y es útil en diferentes casos.

Redirect 301 /carpeta/ http://www.tudominio.com/

Redirect 301 /carpeta/carpeta/index.html http://www.tudominio.com/

Expliquemos lo anterior: la directiva Redirect al igual que otras como RewriteRule requiere dos
parámetros, url_patron y url_destino. Mediante estos parámetro lo que hacemos es indicar que si
hay una petición del navegador a una determinada carpeta, lo redireccionamos de “forma elegante” a nuestra
página de inicio.

3. Páginas de errores personalizadas


Los servidores Web devuelven páginas que muestran un error específico, en caso de que este se haya
producido; existen gran cantidad ellos, uno muy conocido es el 404 “Página no encontrada” o “Recurso no
encontrado” o “Not found”. También existen otros conocidos como 401 “Authorization Required”, 403
“Forbidden”, 500 “Internal Server Error”. Por lo general estos errores se presentan en inglés ya que vienen
desde el servidor, y por su puesto que no tendrán el mismo “look” de nuestro sitio.

Podríamos implementar páginas de errores más acorde a nuestro sitios, y en el idioma que queramos. Una
forma de hacerlo puede ser:

ErrorDocument 400 /error/badrequest.html

ErrorDocument 401 /error/authreqd.html

ErrorDocument 403 /error/forbid.html

ErrorDocument 404 /error/notfound.html

ErrorDocument 500 /error/serverr.html

De esta forma estamos indicando que cuando se presente uno de estos errores, se mostrará una página que
hayamos diseñado para ese fin. No solo se trata de una “mejor presentación” de los errores que se presenten,
sino también se trata de llevar un control de los mismos.
Trata de mantener tu archivo .htaccess liviano, recuerda que este es procesado siempre que se haga una
petición

4. Evitar el hotlink
El hotlink o “robo de ancho de banda” es algo (lamentablemente) muy común en Internet. Se trata de enlazar
directamente a un recurso de un sitio Web a otro, como imágenes. La “víctima” sufre robo de ancho de banda
(que se traduce en dinero) y el “ladrón” usa recursos que no le pertenecen.

Pongamos un ejemplo para ilustrarlo mejor: en un sitio http://sitio-origen.com se ha publicado un artículo


que contiene algunas imágenes; a algún lector le gustó el contenido y quiso (re)publicar el mismo artículo en
su sitio http://otro-sitio.com y enlaza todas las imágenes desde su origen; cada vez que alguien vea el
artículo en http://otro-sitio.com estará usando ancho de banda de http://sitio-origen.com al mostrar
las imágenes.

Para evitar esto, basta con poner las siguientes lineas en un .htaccess:

RewriteEngine on

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www.)?mi-dominio.com/.*$ [NC]

RewriteRule .(jpg|jpeg|gif|png|bmp)$ - [F]

En el ejemplo anterior, si la petición a las imágenes (jpg|jpeg|gif|png|bmp) no viene directamente


de mi-dominio.com no se permitirá el acceso.

Si por el contrario queremos mostrar una imagen en lugar de las originales con algo como “No robes ancho de
banda” agregaríamos la siguiente línea:

RewriteRule .(jpg|jpeg|gif|png|bmp)$ http://www.dominio.com/no-hotlink.gif [R,L]

Hay que aclarar que si usamos una imagen lo ideal sería que no esté en nuestro servidor, sino estaríamos
haciendo “la gracias del bobo” porque de igual forma se estaría usando ancho de banda. Esa imagen bien
podría estar en algún servidor de imágenes gratuito. Para lo cual podría quedar como:

RewriteRule .(jpg|jpeg|gif|png|bmp)$ http://www.servidor-imagenes.com/no-


hotlink.gif [R,L]

5. Bloquear a usuarios o a sitios


Esto puede resultar ser sumamente útil en muchos casos, tanto si se piensa que alguien puede estar tratando de
fastidiarnos, evitar el spam, evitar el abuso de algunos Crawler (o araña Web), o por alguna otra razón.
Para hacer uso de estas técnicas debe estar habilitado el módulo de Apache mod_rewrite, que en la mayoría de
los casos está habilitado; es necesario para utilizar la directiva RewriteEngine on

La forma de bloquear una dirección IP sería la siguiente:

<Limit GET HEAD POST>

order allow,deny

deny from 000.000.000.000

deny from 111.000.000.000

deny from 222.000.000.000

allow from all

</limit>

Con esto estamos especificando que se bloqueen las tres direcciones IP puestas de ejemplo y se permita el
resto

Otro ejemplo para bloquear spammers podría ser:

RewriteEngine on

RewriteCond %{REMOTE_HOST} 000.000.000.000 [OR]

RewriteCond %{REMOTE_HOST} 111.000.000.000 [OR]

Bloquear un sitio que se considere dañino:

RewriteEngine on

RewriteCond %{HTTP_REFERER} sitio-malo.com [NC]

RewriteRule .* - [F]

O para bloquear múltiples sitios dañinos:

RewriteEngine on

RewriteCond %{HTTP_REFERER} sitio-malo.com [NC,OR]

RewriteCond %{HTTP_REFERER} sitio-malo2.com

RewriteRule .* - [F]
Expliquemos lo anterior:

 RewriteEngine On es necesario para poder denegar el acceso a un “referente” (IP,Host,sitio web)


 La terminación [NC] al final de un dominio indica que este se leerá de forma no sensitiva, es decir que puede
ser dominio.com, Dominio.com, DOMINIO.COM
 La [F] indica que rechace la petición, con lo cual el solicitante recibirá un error 403 “Forbidden”.
 La diferencia entre bloquear un solo referente a varios es la terminación [NC, OR] al final del primer dominio
del ejemplo, esto indica que aplicará la misma condición al siguiente dominio

Si al momento de probar alguno de estos ejemplo se genera el error “500 Internal Server” hay que agregar la
siguiente línea:

Options +FollowSymlinks

Esto sucede en los casos en donde FollowSymLinks no está configurado en httpd.conf

Vimos que utilizamos letras en las directivas, como la F. A esto se les llama banderas y especifica alguna
acción. Veamos algunas banderas para que te hagas una idea más clara:

 R: (redirect) para forzar una redirección HTTP


 F: (forbidden) para prohibir el acceso
 G: (gone) para eliminar la URL
 P: (proxy) para pasar la URL a mod_proxy.
 L: (last) para detener el procesamiento.
 N: (next) para continuar
 C: (chain) para encadenar la regla activa con la siguiente
 F: (type) para obligar un determinado tipo MIME.
 NS: (nosubreq) para asegurarse que la regla sólo se aplica si no se realizan subpeticiones internas.
 NC: (nocase) para que la URL no distinga mayúsculas de minúsculas.
 QSA: (qsappend) para añadir una nueva cadena de consulta (query string) en lugar de sustituirla.
 PT: (passthrough) para pasar la URL modificada a otro módulo apache.
 S: (skip) para saltar la siguiente regla.
 E: (env) para asignar una variable de entorno.

Nota: Todo (al menos los “legales”) programa como un navegador, un host, o todo software que realice
peticiones a un sitio Web, debe identificarse, a eso se le llama “referente”, del ingles “ referer“. Esto también
se aplica a los bots o crawler que operan en Internet, como los de Google u otros buscadores que buscan
actualizaciones en los sitios Web y enlazan las URL de cada sitio.

Otra de las cosas que debemos evitar que sucedan en nuestros sitios Web son los site ripper o “destripador
de sitios”. Estas pequeñas monstruosidades son programas offline que operan “en las sombras”, su objetivo
es descargar todos los archivos de un sitio Web, para luego verlos sin conexión. Esto claramente puede
ocasionar problemas en la seguridad, a parte de que estos programas son altos consumidores de ancho de
banda.

Existen muchos bots y rippers que pueden ocasionar daños a todo contenido online, y las listas pueden ser
largas, pero pongamos algunos ejemplos reales para bloquear a estos indeseados:

Options -Indexes
RewriteEngine on

#Spammers

RewriteCond %{REMOTE_HOST} 12.226.240.248 [OR]

RewriteCond %{REMOTE_HOST} 24.111.102.26 [OR]

RewriteCond %{REMOTE_HOST} 24.117.121.113 [OR]

RewriteCond %{REMOTE_HOST} 65.30.216.140 [OR]

RewriteCond %{REMOTE_HOST} 67.87.64.23 [OR]

#Abusivos

RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^Bolt 0 [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^Bot mailto:craftbot@yahoo.com [NC,OR]

RewriteCond %{HTTP_USER_AGENT} CazoodleBot [NC,OR]

RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [NC,OR]

RewriteRule ^.* - [F,L]

#Bloquear bot abusivos por IP

order allow,deny

allow from all

deny from 8.21.4.254

deny from 65.160.238.176/28

deny from 85.92.222.0/24

deny from 206.51.36.0/22

deny from 216.52.23.0/24

Cuando se utilicen reglas de escritura de URL agrega la opción [L] al final, esto le dirá al servidor que no
procese más reglas

6. Obligar a que se use una conexión segura


Si se dispone de un certificado SSL se pueden agregar las siguientes líneas para obligar a que en todo el sitio
se haga uso de SSL:

RewriteEngine On

RewriteCond %{HTTPS} !on

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Hay que hacer notar que si no se tiene un certificado SSL instalado, esto puede generar un error y no se
pondrá tener acceso al sitio.

Para ver una descripción más detallada de las directivas que se pueden usar a la hora de configurar un
archivo .htaccess se puede visitar el sitio Funcionalides básicas del Servidor HTTP Apache

¿Qué es una URL amigable? Lo mejor es un ejemplo. Esto NO es una URL


amigable:

En cambio esta SI es una URL amigable:

Su propio nombre lo indica: las URL amigables son más fáciles de usar y
de recordar por los usuarios y también se dice (y hay quien dice que no)
que son mejores para el posicionamiento en buscadores. Además
describen mucho mejor los enlaces dentro de una página web y añade
un mayor nivel de profesionalidad a nuestras webs.

De todas formas, cuando hemos creado una página dinámica en PHP lo


normal es que tengamos URL no amigables. ¿Cómo las convertimos en
amigables de manera automática? Una manera de hacerlo es con un
archivo .htaccess y gracias a Apache y su mod_rewrite.

Veamos la teoría: mod_rewrite es un módulo de Apache que permite


manipular en el servidor las URLs solicitadas. Es decir, cuando llega al
servidor la solicitud de una URL, esta se comprueba con respecto a una
serie de reglas creadas con Expresiones Regulares creadas para
detectar un patrón determinado. Si se encuentra ese patrón en el URL y
se cumple la condición impuesta por la Expresión Regular se sustituye el
patrón por una cadena de texto o por una acción determinada.

IMPORTANTE: Para que todo esto funcione tiene que estar activado el
módulo mod_rewrite en nuestro servidor Apache. Podemos saber si lo
está simplemente con:

PHP

1 <?php phpinfo(); ?>


Y de entre toda la información recibida si el módulo está activado
tendremos:

Lo más normal es que esté activado. Sino fuera así quizás tendríamos
que hablar con nuestro proveedor de hosting.

Una vez sabemos que mod_rewrite está activado lo que necesitamos es


un archivo .htaccess ¿Qué es un archivo .htaccess? Es un fichero de
configuración utilizado por los servidores web Apache. Son archivos de
texto.

¿Qué vamos a escribir en el archivo .htaccess? Como decíamos antes,


una serie de Expresiones Regulares para interpretar el URL entrante y
crear un URL saliente interpretable por nuestro código. Si no sabéis nada
sobre Expresiones Regulares (o Regular Expressions en Inglés) es
importante que leais algo sobre las mismas antes de seguir. Con una
simple búsqueda en Google podréis encontrar gran cantidad de
tutoriales. Si sabéis inglés, este tutorial de themeforest es muy bueno.
También podéis bajaros esta hoja de referencia de Expresiones
Regulares(en inglés)
Bueno, vamos a pasar a la acción. Os aconsejo que lo hagáis también
vosotros improvisando casos distintos para poderlo comprender mejor.
Vamos a empezar por un ejemplo sencillo: Vamos a crear dos archivos,
uno index.php y otro clientes.php

index.php tendrá únicamente un enlace a clientes.php, para simplificarlo


todo un poco.

PHP

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

3 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">

4 <head>

5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

6 <title>Ejemplo de URL amigable</title>

7 </head>

8 <body>

9 <h1>Ahora estás en index.php</h1>

10 <a href="clientes/juan">Juan</a>

11 </body>

12 </html>

Como podéis ver el enlace es ya una URL amigable. Sin embargo al


hacer click sobre el enlace necesitamos interpretar esa URL que llega al
servidor para que este sepa qué hacer. Creamos un archivo de texto, lo
grabamos como .htaccess y escribimos en él:

Apache
1 # Activar RewriteEngine

2 RewriteEngine on

4 # Reescribir la URL solicitada por el usuario

5 # Entrada: clientes/NOMBRE/

6 # Salida: clientes.php?id=NOMBRE

7 RewriteRule ^clientes/(\w+)/?$ clientes.php?id=$1

Vamos a ver línea a línea. En primer lugar tenemos que activar la re-
escritura de la URL, para lo cual hay que activar RewriteEngine. A
continuación establecemos una Regla de Re-escritura (RewriteRule) para
gestionar la página clientes.php. Como véis, estamos re-escribiendo la
URL amigable clientes/juan al formato normal clients.php?id=’juan’
En esta regla de re-escritura hay dos partes. Por un
lado ^clientes/(\w+)/?$ que es una expresión regular que indica:

Ahora vamos con la segunda parte. En la segunda parte tenemos la


expresión que sustituirá a la primera parte:

Ahora vamos a ver el archivo clientes.php:

PHP

1 <?php

2 // Obtenemos el nombre del usuario desde la URL

3 $id = $_GET['id'];

4 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

5 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

6 <html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">

7 <head>

8 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

9 <title>Ejemplo de URL amigable</title>

10 </head>

11 <body>

12 <h1>Ahora estás en clientes.php</h1>

13 <p>Nombre del cliente: <?php echo $id; ?></p>

14 </body>

15 </html>

Haced la prueba y veréis cómo funciona perfectamente la URL amigable.


Para complicar más las cosas se pueden incluir banderas al final que
cada expresión. Imaginaros por ejemplo que hubiera posibles alternativas
para reescribir una URL amigable, pero queremos que una vez encuentre
la primera se detenga ahí y no siga contrastándose con el resto de
Expresiones Regulares. Entonces la bandera a añadir sería [L]:

Apache

1 RewriteRule ^([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ product.php?id_product=$2$4 [L]

2 RewriteRule ^([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$ product.php?id_product=$1$3 [L]

Tenéis todas las banderas en esta hoja de ayuda rápida de mod_rewrite.

Por último, decir que es aconsejable añadir unas pocas líneas más a nuestro
código. Lo voy a hacer aprovechando para crear un nuevo ejemplo .
Supongamos un caso como este:

El archivo .htaccess que crearíamos sería:

Apache
1 <IfModule mod_rewrite.c>

2 # Activar RewriteEngine

3 RewriteEngine on

4 RewriteBase /

5 RewriteCond %{SCRIPT_FILENAME} !-d

6 RewriteCond %{SCRIPT_FILENAME} !-f

8 # Reescribir la URL solicitada por el usuario

9 # Entrada: ID-NOMBRE

10 # Salida: pruducto.php?id=ID

11 RewriteRule ^([0-9]+)\-([a-zA-Z0-9-]*)$ producto.php?id=$1

12 </IfModule>

Hemos añadido un condicional:

Apache

1 <IfModule mod_rewrite.c>

2 </IfModule>

para comprobar que está activado el módulo antes de hacer nada. Luego
hemos añadido “RewriteBase /” que indica que el directorio base es el
raíz. Si fuera por ejemplo una carpeta llamada “base” haríamos
“RewriteBase /base”.
Además hemos añadido dos líneas que lo que hacen es restringir la re-
escritura sólo a rutas que no existan previamente. Es decir, que no
valdría por ejemplo para ejemplo.com/imagenes/logo.png. La primera
línea previene los directorios que ya existan con la bandera !-d y la
segunda hace que se ignoren ficheros que ya existan con la bandera !-f.

Luego, en la regla de reescritura, tenemos una entrada compuesta por


números, luego va un guión (/-) y luego una cadena que puede incluir
letras en mayúsculas, en minúsculas, números y guiones (por lo que 34-
lampara-verde cumpliría). La salida que ya conoce nuestro código PHP
(aunque esto está oculto al usuario) es producto.php?id=$1, siendo $1 el
valor que hemos atrapado entre los dos primeros paréntesis (en este
caso, 34). Si observáis tenemos también atrapado un segundo grupo que
es ([a-zA-Z0-9-]*) y que lo podríamos recuperar con $2, pero en este
caso no nos sirve.

Esto es sólo el comienzo, pero toda la base está ahí. Otra manera
alternativa de conseguir URL amigables es combinar un archivo
.htaccess con PHP, pero eso sería materia de otro artículo. Algunas de
las lecturas recomendadas a continuación sí indican cómo hacerlo.

Lecturas Recomendadas
baluart.net: Ofrece una función muy interesante para transformar el título
de una noticia (por ejemplo) y transformarlo (cambiando las letras con
tildes, eñes, etc) para conseguir una frase asequible a los buscadores y
navegadores – Urls Amigables con PHP
corz.org: more .htaccess tips and tricks..
nettutplus.com: Using htaccess Files for Pretty URLS
nettutplus.com: A Deeper Look at mod_rewrite for Apache
stewparkin.com: Apache Re-Writes in .htaccess
Source Rally: Make pretty URLs with PHP and mod_rewrite
AddedBytes: URL Rewriting for Beginners
webm.ag: How To Make Dynamically Generated SEO-Friendly URLs
Using PHP And .htaccess
noupe: 10+ Mod_Rewrite Rules You Should Know

https://desarrolloweb.com/manuales/htaccess-para-urls-amigables.html

Potrebbero piacerti anche