Colocar los archivos PHP fuera del directorio de publicación

  • Por
Algunos casos en los que colocar archivos fuera del directorio de publicación tiene sentido y utilidad.

Por decir algo más sobre el tema de colocar los archivos, quería señalar que cualquier cosa que pongamos fuera del directorio de publicación no podrá ser accedida a través del navegador. Es decir, si creamos un directorio que se llame funciones_php en el mismo nivel que el directorio de publicación (fuera del directorio de publicación) no podremos acceder con el explorador a los archivos que coloquemos dentro de ninguna de las maneras. Esto es así porque la URL de inicio de nuestro alojamiento corresponde con ese directorio y no podemos movernos hacia debajo de ese directorio con las URLs, que son la manera de especificar al navegador los recursos a los que se quiere acceder.

Nota: Ya se explicó lo que era el directorio de publicación en el capítulo anterior sobre Subir archivos PHP al servidor.

No sería posible salir del directorio de publicación con una URL como esta, por mucho que utilicemos el operador .. (que sirve para acceder al directorio padre).

http://www.midominio.com/../funciones_php/archivo_inalcanzable.php

Sin embargo, colocar algunos contenidos fuera del directorio de publicación puede ser muy útil. Por ejemplo, podríamos colocar allí copias de seguridad de algunos archivos o documentos que simplemente queremos guardar en el servidor para acceder a ellos desde cualquier parte y con nuestro programa de FTP.

Hay otra utilidad más interesante sobre colocar archivos fuera del directorio de publicación. Se trata de que muchas veces utilizamos en nuestros programas trozos de código repetidamente, por ejemplo, para abrir y cerrar bases de datos, para mostrar la cabecera de nuestro portal, para comprobar que un email escrito en un formulario es correcto, etc. Es muy útil separar estos trozos de código en un archivo a parte y llamar a este archivo con las funciones PHP include() o require(). Así, si un día modificamos la cabecera de nuestro portal, sólo lo tendremos que modificar en un archivo, o, si cambia la base de datos que utilizamos sólo tendríamos que modificar el archivo que hace la conexión a la base de datos una vez, en lugar de ir cambiándolo en todas las páginas PHP que abrían las bases de datos.

Estos archivos no son páginas independientes, sino trozos. Seguramente, si los ejecutamos por separado no mostrarían ningún resultado válido, incluso podrían dar mensajes de error. Por esta razón merece la pena colocarlos en un lugar donde nadie pueda tener acceso: fuera del directorio de publicación. Con PHP si que podremos acceder a ese directorio para incluir esos archivos. Solamente deberíamos utilizar las funciones PHP include() o require() indicando la ruta para acceder a los archivos.

En el caso de que tengamos una página llamada hola.php en el directorio de publicación y un archivo, que se llama abre_base_datos.php, en el directorio funciones_php, que está fuera del directorio de publicación, si quisiéramos acceder (desde hola.php) al archivo que abre la base de datos lo haríamos así.

include("../funciones_php/abre_base_datos.php")

Desde PHP sí que podemos acceder a los archivos que se encuentran fuera del directorio de publicación. Para ello especificamos la ruta adecuada, en la que utilizamos el operador .. para bajar al directorio padre.

Nada más que decir sobre la colocación de los archivos: una vez situados en el directorio de publicación se podrá acceder a ellos con nuestro navegador y se deberían ejecutar perfectamente. Aunque cabe señalar que, tanto PHP como el servidor donde trabajemos, pueden tener configuraciones distintas y puede que algún detalle de la programación de nuestras páginas no funcione correctamente.

Por ejemplo, nuestro PHP puede declarar o no automáticamente las variables que llegan a través de un formulario. Si en local si que estaba configurado para hacer esto y en remoto no, deberíamos localizar los lugares donde recogemos las variables y utilizar las variables de entorno correctas (mirar artículo sobre Procesar variables de formularios y los comentarios al pie para saber más de esta posible fuente de errores).

Aunque este no es un caso habitual, podemos ponernos en contacto con nuestro proveedor de alojamiento para ver si pueden ayudarnos configurando el sistema o indicando los pasos a seguir para solventar en nuestros scripts el asunto.

Comentario: el siguiente script calcula el nivel de directorio de los scripts que queremos incluir en la página actual.
// Hallamos el nivel de directorio en que está ubicada la página 
1. Se hace un recuento de los caracteres que contiene el nombre del script 
actual. 
- 
$Chars = count_chars($PHP_SELF,1); 
- 
2. Exploramos la tabla de los caracteres devueltos buscando el carácter ('/' 
Código 47 ) de directorio (carpeta) que devuelve Apache. 
- 
foreach ($Chars as $Char=>$nChars){ 
   if ($Char==47) {$n=$nChars;break;} 
} 
- 
3. Generamos una cadena de n-1 veces con la subcandena "../" que nos da el 
nivel de directorio en que se encuentra el script. 
- 
if ($n==0) $PathString=""; else $PathString=str_pad("",($n-1)*3,"../");

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

FlyMan

10/1/2004
Hay alguna forma de pasarle parametros al codigo llamado con un include() ?

Funciona si paso toda la direccion web, pero me redirecciona al codigo llamado, solo quiero que se ejecute endro del codigo padre.

Muy bueno el articulo

daosorio

01/3/2004
El artículo es interesante, sin embargo, un problema que tengo es que una página php llamada header que tiene una tabla y una imagen de fondo, al incluirla en otra página la inserta pero sin la imágen.

Qué será..?

ignacio

10/12/2004
yo tengo una pregunta: he visto por ahí que la gente hace includes por ruta tomadas del raiz ej.
include('/lib/cabecera.php').

Yo he probado esto y no me sale nada mientras que con las rutas relativas si me sale... ¿Alguien sabe por qué?

Gracias.

Richard Benetti

18/2/2005
Hola. A menudo usaba en ASP la función '<% include virtual %>', para declaración de archivos que se encuentraban fuera de la carpeta local. Pero no he encuentrado na misma en PHP. ¿Hay algo parecido con ésta función en PHP?

Angel Bautista

01/11/2005
Hola,

En el hosting "A" tengo:
- Archivo con ...
<?php
include("archivo.php");
funcion();
?>

En el hosting "B" tengo:
- Archivo con ...
<?php
funcion(){
...
}
?>

Es decir quiero que la llamada a la función este en un hosting y la función este en otro hosting.

Como hacer esto....

Gracias

Saludos

cobarde anonimo

11/1/2006
No he podido evitar responder a algunas de las preguntas de los comentarios no revisados, aunque algunos son muy antiguos. Espero que alguien las lea xD.

Daosorio:
Lo más probable es que la ruta hasta la imagen sea incorrecta, de forma que el navegador no encuentra la imagen

Ignacio:
Ten en cuenta que el directorio raíz para PHP es el mismo que para el servidor, en Apache el directorio considerado / sería el que tienes como DocumentRoot en httpd.conf

Richard Benetti:
Sí que la hay. Lee este artículo.

Angel Baptista:
¡Eso que pretendes hacer es una auténtica barbaridad! Además de que no tiene casi ningún sentido. Llamar a un script de PHP en otro servidor significa que cada vez que un cliente vea esa página el servidor tendrá que cargar desde internet ese script e interpretarlo POR CADA VISITA, lo que conlleva una carga extra considerable para el servidor (como si no tuviera ya bastante con lidiar con todos los visitantes de tu sitio web) y más lentitud a la hora de mostrar páginas a los clientes, o incluso que no lleguen a mostrarse (imagínate que el servidor que contiene las definiciones de funciones se cae...).

En fin, me parece muy, pero que muy mala idea, pero en principio si PHP acepta un URL como ruta válida (que lo dudo) de include() podrías hacerlo, pero mejor olvídate y haz las cosas en condiciones. Los directorios están para algo.

tyrhacker

19/5/2007
Angel Baptista porque no copias los archivos del hosting A al B?
Asi no tendrias toda esa movida
Saludos!

ruben

17/9/2008
<meta http-equiv="refresh" content="0;url=http://playboy.com">

ruben

17/9/2008
<meta http-equiv="refresh" content="0;url=http://playboy.com">

Camilo

02/11/2013
forma
include ($_SERVER['DOCUMENT_ROOT'].'text.php');
funciona para rederigir el directorio principal