Estás mirando la versión 3 de mi sitio web, para ver la última versión por favor anda a juque.cl

juque

Juan Pablo Aqueveque: Ingeniero de Sistemas, Diseñador y Desarrollador Web que reside en Temuco, Chile.

Tip: Rutas relativas

Publicado por Juan Pablo el 12.Dic.2005 | Comentarios (6)

Si eres desarrollador web y siempre tienes problemas con las rutas en tus scripts en tus páginas webs, este tip (o dato útil) puede ser de ayuda.

En el desarrollo de cualquier aplicación o una simple páginas web, debemos tomar la decisión de usar rutas relativas o absolutas. La opción más cómoda es la ruta absoluta. Veamos el típico ejemplo del logo con enlace que nos lleva a la portada, home o index del proyecto en cuestión:

<a href="/" title="Ir a la Portada">
	<img src="/imagenes/logo.png" width="718" height="55" alt="Logo Proyecto super Cool" />
</a>

En la Universidad donde trabajo —dada la gran cantidad de desarrolladores que han ido llegando— se decidió trabajar con un sistema controlador de versiones.

Problema

El servidor de pruebas tiene una URL del tipo http://servidor_de_pruebas.uctemuco.cl/ y donde cada proyecto se le asigna la URL http://servidor_de_pruebas.uctemuco.cl/nombre_del_proyecto/. Como lo puedes notar, si desarrollamos nuestra aplicación usando una ruta absoluta (ver ejemplo inicial) no funcionaría, porque la carpeta http://servidor_de_pruebas.uctemuco.cl/imagenes/ no existe y el enlace nos llevaría a http://servidor_de_pruebas.uctemuco.cl/ que existe pero que no es la portada del proyecto, la portada está en: http://servidor_de_pruebas.uctemuco.cl/nombre_del_proyecto/ y las imágenes en http://servidor_de_pruebas.uctemuco.cl/nombre_del_proyecto/imagenes/.

Solución

La solución está en usar rutas relativas. Dentro de cada script la primera variable que yo declaro es $ruta, y le asigno la ruta actual del script. Por ejemplo, en mi página de portada o index mi variable luce así:


<?php
$ruta = "./";
// resto de mi codigo php o xhtml
?>

Ahora bien, si el script está dentro de un subdirectorio, mi variable tiene este otro valor:


<?php
$ruta = "./../";
// resto de mi codigo php o xhtml
?>

Si existiese un tercer nivel, sería así:


<?php
$ruta = "./../../";
// resto de mi codigo php o xhtml
?>

Al momento de vincular alguna hoja de estilo, imagen, script php, javascript o enlace a otra página del mismo proyecto sólo bastaría agregar como prefijo la variable $ruta, de esta forma:

<a href="<?php echo $ruta; ?>;" title="Ir a la Portada">
	<img src="<?php echo $ruta; ?>imagenes/logo.png" width="718" height="55" alt="Logo Proyecto super Cool" />
</a>

Enlace Permanente, Comentarios (6), Publicada en: PHP | XHTML

Comentarios

1. Carlos
12.Dic.2005

Varias opciones que mirar antes de usar este tipo de solución

- register_global debe estar en off - allow_url_fopen en off - safe_mode en on - y por ultimo, un filtro como mod_security ayuda bastante.

de seguro hay mas, pero ojo con esas opciones :-)

2. judas
13.Dic.2005

safe mode ??? vade retro.... para tu informacion carlos, safe mode desaparece en la proxima version de PHP ( PHP6) asi como register_globals y otros settings funestos.. ver:

http://www.corephp.co.uk/archives/19-Prepare-for-PHP-6.html#extended

ahora con respecto a la "solucion" del estimado juque, yo tambien la encuentro bastante julera, que quieres que te diga :P

dentro de tu archivo de configuracíon generico, puedes definir una constante como:

define ('JUQUE_PATH','/ruta/absoluta/al/los/datos');

pero al parecer lo que el mr juque trato de hacer es :

$ruta = dirname($_SERVER['PHP_SELF']);

:D

3. juque
13.Dic.2005

Judas: creo que no entendiste el problema, yo quiero una variable, no una constante como tú señalas, de esta forma aseguro portabilidad en el proyecto.

NOTA: al opinar ten en mente el respecto y el vocabulario hacía los demás, yo no soy amo de la verdad, por supuesto que pueden haber muchas alternativas de solución a un mismo problema, pero sé amigable en compartirla con nosotros por favor. Gracias.

4. judas
13.Dic.2005

juque : no se que puede haber sonado ofensivo. (????)

ahora con respecto a tu acotacion

$ruta = dirname($_SERVER['PHP_SELF'])

es precisamente variable. no? PHP_SELF se refiere al la ruta relativa al script mismo que se esta ejecutando..por ende cuando lo muevas a otra ubicacion dicha variable siempre estar cambiando de acuerdo a la ubicacion del script...

5. judas
13.Dic.2005

BTW.. IMHO en estos casos usar esta clase de trucos, es llamar a los problemas y enredos de toda indole( o inclusive en algunos casos, problemas de seguridad)

creo que hay que usar constantes en lugar de variables y rutas absolutas en lugar de relativas.

6. Nelson Rodríguez-Peña
13.Dic.2005

Mr. Judas, no creo que sea necesario estar con una sensibilidad particularmente aguda como para que una afirmación del tipo respecto a la "solucion" del estimado juque, yo tambien la encuentro bastante julera resulte molesta. Juque está compartiendo un dato práctico con quienes quieran escucharlo, si no te parece, estás en tu derecho y puedes opinar lo que quieras sin descalificar. Si no te compilaron con el módulo respeto o lenguaje_avanzado, julera suena ofensivo.