Displaying articles with tag

Optimizando una web de URL extensas a URL amigables con Apache y PHP

Posted by willywg, Sun Jun 25 11:58:00 UTC 2006

Resumen. En este manual Ud. aprederá cómo optimizar de manera sencilla una web dinámica hecha en PHP, cuyas URL's pasadas a los enlaces contengan extensas variables pasadas mediante GET, a una web cuyas URL sean amigables (fáciles de recordar).

Introducción.

Los que programamos en PHP, o bajo cualquier otro lenguaje de programación orientado a web, por lo general tendemos a pasar datos de una web origen a otra destino mediante variables del tipo GET generando enlaces tal como: http://www.tiperu.com/index.php?mod=ecommerce&producto=tienda&op=3 que difícilmente son indexadas por algunos buscadores y lo que es peor aún: son nada asimilables por un usuario común (a este grupo de URL las llamaremos URL extensas para efectos del presente artículo). Si lo vemos desde esa perspectiva justo sería afirmar que las web dinámicas tienen desventajas en ese ambito sobre las web estáticas del tipo http://www.tiperu.com/ecommerce.html que son mucho más fáciles de recordar por su simpleza y carencia de variables vía GET, a este tipo de URL las conocemos (y me referiré a ellas en adelante) como URL amigables.

Quiero dejar en claro que lejos de la división convencional entre lo que son web estáticas o dinámicas en este manual me referiré a ambas en función a la diferencia de URL especificadas en el párrafo anterior - hecha la aclaración continuo con el artículo.

Felizmente para los que usamos Apache como servidor web, conjuntamente con PHP, esto tiene solución gracias al módulo mod_rewrite (URL Rewriting Engine) que nos permitirá mediante unas cuantas reglas transformar nuestras URL extensas en URL amigables.

Si bien es altamente aconsejable aprender el correcto manejo del mod_rewrite y sus correspondientes reglas, en este artículo no se hará explicación extensiva del mismo pues su objetivo principal, y claramente detallado en el título, es mostrar al lector cómo optimizar una web de URL extensas a URL amigables; con esto quiero dejar a entender que se asume que el lector posee un website ya creado con URL extensas y desea pasarlas fácilmente a URL amigables "en un dos por tres" .

Preparando el archivo ".htaccess".

El archivo .htaccess nos permite pasarle información al servidor Apache para que cumpla ciertas reglas de configuración en la carpeta que lo contenga, por tal motivo debemos copiar este archivo en la carpeta que contengan los archivos php en los cuales realizaremos los cambio de URL:
  1. Options +FollowSymLinks
  2. RewriteEngine on
  3. #4 variables
  4. Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5&$6=$7&$8=$9
  5. #3 variables
  6. Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5&$6=$7
  7. #2 variables
  8. Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5
  9. #1 variable
  10. Rewriterule ^(.*)/(.*),(.*)/$ $1.php?$2=$3
En las dos primeras líneas nos aseguramos de que esté activado el mod_rewrite en el Apache (si esto no funciona deberá comunicarse con su administrador para que active el módulo en el servidor).

Las líneas antecedidas por "#", como las 3, 5, 7 y 9 ; son simplemente comentarios, no los tome en cuenta.

En las líneas 4, 6, 8 y 10 se establecen las reglas que nos permitirán tranformas nuestras URL extensas en amigables. Analizaremos aquella que permite transformar dos variables, las demás son similares:

Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5

La expresión en rojo es la nos permitirá escribir la regla en el Apache. La cadena en color verde oscuro permite escribirá la URL amigable, inicia desde el caracter ^ hasta el $. Y finalmente la cadena en azul es nuestro URL extenso. La transformación se hará de la siguiente manera:

De URL extensa:
./index.php?categoria=monitores&productoID=12345

En URL amigable:
./index/categoria,monitores/productoID,12345/

Como se puede apreciar la regla tomara el nombre del script y le quitara la extensión ".php" para tomarlo como un directorio (nótese la parte en negritas):
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5 ./index.php?categoria=monitores&productoID=12345 ./index/categoria,monitores/productoID,12345/

Seguidamente toma el primer par ?valor=variable y lo transfroma en una subcarpeta valor,variable/:
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5 ./index.php?categoria=monitores&productoID=12345 ./index/categoria,monitores/productoID,12345/

Y finalmente hace lo propio con el par &valor=variable y lo transforma en una subcarpeta valor,variable/:
Rewriterule ^(.*)/(.*),(.*)/(.*),(.*)/$ $1.php?$2=$3&$4=$5 ./index.php?categoria=monitores&productoID=12345 ./index/categoria,monitores/productoID,12345/

Como ya se habra dado cuenta, los valores antecedidos por el símbolo dólar ($) en la parte de las URL extensas reemplazan a los (.*) de las URL amigables.

Bueno ya tenemos el archivo .htacces que nos permitirá lograr los resultados que deseamos a nivel del servidor, ahora procederemos a crear el script php que nos permita cambiar nuestras URL extensas en amigables sin tener que hacer ninguna modificación directa en los "N" enlaces que posea nuestro sitio web.

Generando el script en php.

El script php que se usaremos se encargará básicamente de tomar la URL extensa, si esta ha sido pasada mediante el método GET, y la transformará en una URL amigable a la cual redirecionará usando la función header. Puesto que header redirecionará hacia la misma web, y esto causará lo que se conoce como un bucle infinito, se hará uso de variables de sesión que nos ayuden a evitar tal inconveniente; por tal motivo nuestro script se seccionará en 2 partes: la primera irá en las primeras líneas de todas las páginas a las que aplicaremos el script, y la segunda parte (encargada de limpiar la variable de sesión) irá al final de las páginas. Aclarados los detalles, explicaré mediante comentarios el script php:
< ? php
//Iniciamos o continuamos la sesión encargada de evitar el bucle infinito
session_name("url_amigable");
session_start();
//Almacenamos datos del server, script y variables (pasadas por GET)
$Server=$_SERVER['SERVER_NAME'];
$Script=$_SERVER['PHP_SELF'];
$Variables=$_SERVER['QUERY_STRING'];
//Verificando si tiene variables por GET
//y no se han pasado datos mediante un form por POST
//ya q al redireccionar un post puede ocasionar errores.
//Tambien verificamos que la variable de sesión 'Listo'
//sea diferente a 1, esto nos eviara un bucle infinito.
if(!empty($Variables) && $_SERVER['REQUEST_METHOD']=='GET' && $_SESSION['Listo']!=1){
//Si tiene variables pasadas por GET se procede a hacer el cambio.
//1. Agrupando $Variables por "variable=valor" en el array $Variable.
$Variable=explode("&",$Variables);
//2. Sustituyendo "=" por "," y concadenandolo en variable $Amigable.
($i=0; $i < count($Variable); $i++){
$Amigable.="/".str_replace("=",",",$Variable[$i]);
}

//3. Quitando la extension ".php" a $Script para simular un directorio.
$Dir=str_replace(".php","",$Script);
//4. Generando la URL Amigable.
$URL_AMIGABLE="http://".$Server.$Dir.$Amigable."/";
//5. Colocando la variable de sesión 'Listo' a 1 para evitar el bucle infinito
// al redireccionar la web.
$_SESSION['Listo']=1;
//6. Redireccionando a la url amigable
header("Location: $URL_AMIGABLE");
//7. Exit hará que culmine hasta este punto el script, si no estuviera 'exit'
// el script continuaría ejecutándose y llegaría hasta el final del mismo, es decir,
// a la parte donde colocamos a la variable de sesión 'Listo' en cero, originandose
// entonces un bucle infinito.
exit;
}
//Cambie $_URL_BASE por la ruta raiz de su web, ya que al simular la url amigable
//directorios, hará que no muestre adecuadamente los origenes de los recursos que
//llama su página web.
$_URL_BASE="http://".$Server."/pruebas/url_amigable/index.php";
?>
< html >
< head >
< title >URL Amigables< / title>
< base href = "< ? echo $_URL_BASE;?>" target="_top" />
< / head>
< body>
< ! - - Aquí el contenido de su página web - ->
< / body>
< / html>< ? php
//Limpia el posible bucle, es decir, se puede volver a hacer el envío. $_SESSION['Listo']=0;
?>

Recomendaciones finales.


Como habrán podido ver el script no es complicado, y la adaptación a una web ya constituida tampoco lo será. Ya he probado la técnica en uno de mis proyectos (de manera local) y me ha funcionado bastante bien.

Lo que sí quiero aclarar es que al momento de testear esta técnica en una url de 5 variables a más me generó errores (básicamente no encuentra la url amigable generada); una url de 4 variables redireciona correctamente, pero si luego de ello refresco el navegador genera el mismo error, es decir, no (re)carga la url amigable.

Mi consejo es que usen esta técnica en una url de 3 a menos de 3 variables pasadas por GET y personalicen este script a sus necesidades. Y como es lógico, les aconsejo bastante informarse más sobre el uso del mod_rewrite en Apache, creanme que les aliviará más de un dolor de cabeza.

Finalmente les diré que pueden descargarse el script desde aquí: url_amigable.zip.

Derechos de Autor.

Se autoriza la libre distribución y uso de este material, así como también su publicación en otros sitios web (siempre que no sea con fines comerciales ni lucrativos) de manera total y/o parcial siempre que no se altere el sentido de su contenido y se indiquen expresamente los siguientes datos (salvo que mi persona permita lo contrario):

Autor: William Wong Garay Website: http://www.tiperu.com Blog: http://willy.tiperu.com

Libros recomendados.

Apache: The Definitive Guide (3rd Edition) Beginning PHP5, Apache, and MySQL Web Development (Programmer to Programmer) Apache Server 2.0: The Complete Reference

17 comments | Clasificado en: Artículos Programación | Tags:
#

Manual básico de creación de Host Virtuales en Apache

Posted by willywg, Sat May 13 12:27:00 UTC 2006

Resumen. Un host virtual, o VirtualHost, en Apache nos permite mantener múltiples nombres de host en nuestro servidor. El presente manual permite explicar de manera sencilla y concisa cómo crearlos en nuestro servidor local y configurar nuestro sistema operativo para que acepte dichos nombres de host.

Introducción

Muchos de nosotros estamos acostumbrados a trabajar en nuestro servidor web local para nuestros proyectos en modo de prueba o testeo, y por lo generalmente tenemos más de un proyecto en camino, sea laboral (p.e. el web site de un cliente) o personal (p.e. nuestro blog o comunidad virtual). Solemos guardar estos proyectos en carpetas separadas dentro un directorio tal como C:/www/ que sería nuestro directorio raíz web (desde el cual llamamos a nuestro clásico http://localhost/ ), y llamar a nuestros proyectos de la siguiente manera en nuestro navegador preferido:

http://localhost/tiperu , http://localhost/willyblog , http://localhost/bazar , entre otros por citar un ejemplo.

En cierto modo podemos trabajar de manera regularmente cómoda, pero quizá desearíamos usar el nombre del dominio real con el que trabajos estos proyectos en la Internet. Así podríamos hacer usar lo siguiente:

http://www.tiperu.com/ en lugar de http://localhost/tiperu , http://willy.tiperu.com/ en lugar de http://localhost/willyblog , o http://www.bazarperu.com/ en lugar de http://localhost/bazar

Y cómo hacemos esto?, pues la respuesta es sencilla, configurando la directiva VirtualHost de nuestro servidor Apache y el archivo host de nuestro Sistema Operativo (Windows o Linux).

Configurando el archivo host

Lo primero que configuraremos será el archivo host de nuestro SO, para Linux lo podemos encontrar en el directorio /etc/ mientras que para Windows XP lo encontramos en C:/Windows/System32/Drivers/etc/. Este archivo lo que hace es asignar direcciones IP a los nombres de host, para que al colocar por ejemplo 127.0.0.1 o localhost en nuestro navegador nos redireccione al mismo contenido. No se sorprenda si encuentra el siguiente par en el archivo host: 127.0.0.1 localhost, dónde el primer valor es nuestra dirección IP local y el segundo el nombre del host.

Lo que haremos ahora es colocar tantas entradas cono deseemos para nuestros proyectos, relacionando la IP local con nuestros nombres de dominio. Para el ejemplo tomaremos las rutas que di anteriormente, las cuales se colocarán debajo del par 127.0.0.1 localhost:
#localhost
127.0.0.1 localhost
#TIPeru COM SAC (Mi empresa de hosting)
127.0.0.1 http://www.tiperu.com/
#Mi blog
127.0.01 willy.tiperu.com
#BazarPeru (Tienda Virtual)
127.0.0.1 http://www.bazarperu.com/

Nótese que he colocado el caracter “#” . Este carácter nos permite ingresar un texto a manera de comentario. Bueno, una vez hechos estos cambios procedemos a guardar el archivo.Para confirmar su funcionamiento abra su navegador y digite cualquiera de los nombres de host que ha agregado, recuerde de respetar el nombre completo, ya que una entrada del tipo tiperu.com no tendría efecto por carecer del www. que lo antecede.

Si al ingresar el nombre del host le muestra el contenido de su http://localhost/ significa que la asignación de IP para el nombre de host a tenido efecto. Nótese que aún su nombre de host no apunta a la carpeta en la que se guarda su proyecto. Este punto lo veremos a continuación.

Configurando el archivo httpd.conf del Apache

Ahora configuraremos nuestro servidor Apache para que acepte los nombres de dominio agregados al archivo host y los relacione con las carpetas que albergan los archivos de nuestros proyectos. Para ello abriremos el archivo conf/httpd.conf y nos dirigiremos a la siguiente sección:
#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#

Notas:

1. Haga una copia de respaldo de sus archivos de configuración antes de realizar cualquier cambio en ellos.

2. Si no encuentra la sección Virtual Hosts en el archivo httpd.conf quizá lo pueda ubicar en la siguiente ruta conf/extra/httpd-vhosts.conf

Luego procederemos a quitar el comentario de ##NameVirtualHost *:80 dejándolo de la siguiente manera:
#
# Use name-based virtual hosting.
#
NameVirtualHost *:80
#
Esta acción nos permisita trabajar con host virtuales basados en nombres. El * representa un número IP y puede ser reemplazado por uno de ellos si desee. Para el ejemplo déjelo tal y como esta.

Enseguida procederemos a configurar los host virtuales, agregándolos de la siguiente manera:
#localhostDocumentRoot "C:/www"
ServerName localhost:80
#TIPeru COM SAC

DocumentRoot "C:/wwww/tiperu"
ServerName http://www.tiperu.com/
#Mi Blog

ServerAdmin willy@tiperu.com
DocumentRoot "C:/wwww/willy"
ServerName willy.tiperu.com
#BazarPeru

ServerAdmin webmaster@bazarperu.com
DocumentRoot "C:/wwww/bazar"
ServerName http://www.bazarperu.com/
Como se puede aprecia cada Virtual Host esta encerrado entre las etiquetas y que contiene el parámetro *:80 que es NameHostVirtual al cual se refiere. Dentro de estas etiquetas, 2 valores son esenciales para que funcionen correctamente nuestros host virtuales:

DocumentRoot. Que es la ruta en la cual se guarda nuestra página web; y • ServerName. Que es el nombre del host que previamente agregamos al archivo host de nuestro S.O.

Adicionalmente podemos agregar otros valores, tal como si cada host virtual fuera un host independiente (p.e. ServerAdmin).

Nótese algo muy importante. Si bien localhost es nuestro servidor local por defecto, debemos también agregarlo con un virtual host para que todo trabaje en orden, y debemos agregarle los mismos valores del DocumentRoot y ServerName que posee en su configuración global, de lo contrario no cargará el host.

Finalmente lo que haremos es para el servicio de nuestro servidor Apache y volverlo a iniciar. Si todo esta correctamente configurado podemos cargar en nuestro navegador uno de los nombres de host y ver los resultados (p.e. http://www.tiperu.com/). Si carga el contenido de la carpeta que le hemos asignado en el y no el directorio raíz del localhost quiere decir que todo esta correcto. Felicidades Ud. Ya tiene configurado su host virtual !!!

Sobre el Autor

William E. Martín Wong Garay es desarrollador y programador web autodidacta. Actualmente es gerente general de la empresa TIPeru COM SAC y teletrabaja realizando tiendas virtuales tanto para clientes nacionales (Perú) como para el extranjero (USA). Ocasionalmente lo pueden encontrar en el chat de la ANWMP en el servidor de Dalnet, canal #anwmp , y postea en los foros de la misma. Puede contactarlo mediante su correo-e willy@tiperu.com para consultas sobre el presente artículo o temas relacionados al e-commerce o desarrollo web en general.

Agradecimientos

Al equipo de TIPeru COM por su contante apoyo. Y a la Asociación Nacional de Webmaster del Perú (ANWMP) por resolver mis dudas e interrogantes mediante sus foros y Chat en línea.

Bibliografía básica en línea

Soporte Apache de hosts virtuales basados en nombre http://quark.fe.up.pt/ApachES/manual-es/vhosts/name-based.html

Configuración de Apache | Cibernetia http://www.cibernetia.com/manuales/instalacion_servidor_web/ 2_3_configuracion_apache.php

Virtual Host examples for common setups http://quark.fe.up.pt/ApachES/manual-es/vhosts/examples.html

Libros recomendados.

Apache: The Definitive Guide (3rd Edition) Apache Server 2.0: The Complete Reference

6 comments | Clasificado en: Artículos Programación Tecnología | Tags:
#

Host Virtuales en Apache

Posted by willywg, Sun Mar 19 11:30:00 UTC 2006

Hace poco estuve investigando sobre cómo hacer que mi host local (Localhost) que corre con el servidor web Apache pueda no solo reconocer localhost como nombre de host en mi PC, sino tambien host tales como www.tiperu.com o mi propio blog willy.tiperu.com ; y luego de indagar y "Googlear" por las red di con la solución.

Bueno como todo buen usuario agradecido de la red decidí crear un manual simple para crear host virtuals en Apache. Los interesados lo pueden descargar desde este elace: MANUAL BASICO DE CREACION DE HOST VIRTUALES EN APACHE

Espero sus criticas y preguntas al respecto. ;)

Libros recomendados.

Apache: The Definitive Guide (3rd Edition) Apache Server 2.0: The Complete Reference

3 comments | Clasificado en: Tecnología | Tags:
#