Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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:
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
articulo.php
PHP:
<?php
echo "Estas en el articulo: " . $_GET["id"]
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:
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
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 RewriteEngine On
2
3 RewriteRule ^noticia/(.+)_([0-9]+)$ cargarNoticia.php?id=$2
1 RewriteEngine On
2
3 RewriteRule ^noticia/(.+)$ cargarNoticia.php?id=$1
1 RewriteEngine On
2
3 RewriteRule ^home.html hola.html
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
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.
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.
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.
$url = $_GET['blog_url'];
FROM article
ON users.user_id = article.user_Id
ON articles.article_id = article.article_id
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.
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}.php -f
# Producto
# Entrada: producto/NOMBRE_PRODUCTO/
# Salida: productos.php?id=NOMBRE_PRODUCTO
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:
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.
<files archivo-configuracion.php>
order allow,deny
</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
</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.
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.
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:
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.
Para evitar esto, basta con poner las siguientes lineas en un .htaccess:
RewriteEngine on
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:
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:
order allow,deny
</limit>
Con esto estamos especificando que se bloqueen las tres direcciones IP puestas de ejemplo y se permita el
resto
RewriteEngine on
RewriteEngine on
RewriteRule .* - [F]
RewriteEngine on
RewriteRule .* - [F]
Expliquemos lo anterior:
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
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:
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
#Abusivos
order allow,deny
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
RewriteEngine On
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
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.
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
Lo más normal es que esté activado. Sino fuera así quizás tendríamos
que hablar con nuestro proveedor de hosting.
PHP
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4 <head>
7 </head>
8 <body>
10 <a href="clientes/juan">Juan</a>
11 </body>
12 </html>
Apache
1 # Activar RewriteEngine
2 RewriteEngine on
5 # Entrada: clientes/NOMBRE/
6 # Salida: clientes.php?id=NOMBRE
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:
PHP
1 <?php
3 $id = $_GET['id'];
5 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
7 <head>
10 </head>
11 <body>
14 </body>
15 </html>
Apache
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:
Apache
1 <IfModule mod_rewrite.c>
2 # Activar RewriteEngine
3 RewriteEngine on
4 RewriteBase /
9 # Entrada: ID-NOMBRE
10 # Salida: pruducto.php?id=ID
12 </IfModule>
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.
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