10
 
22/02/2022

Función PHP para acceder al directorio o ruta no pública de los documentos HTML

Función PHP para acceder al directorio o ruta no pública de los documentos HTMLEn este recurso creado en PHP lo que se consigue es acceder o mostrar el directorio o ruta no pública de nuestro sitio web como por ejemplo: '/home/account/' ó '/var/www/'.

Luego de pasar algún rato buscando algún recurso que permitiera de alguna manera leer y acceder al directorio o ruta anteriormente más alta de los documentos HTML ("public_html" ó "html"), y luego de no de tener éxito en el cometido, decidí que era el momento de crear mi propia función de usuario para que resolviera mi problema.

Como muchos sabrán, en PHP existen diversas maneras para acceder a la raíz de nuestros documentos públicos de un sitio web, entre esas opciones nos encontramos con el array $_SERVER, que «contiene información, tales como cabeceras, rutas y ubicaciones de script».

Veamos algunos resultados que no me ayudaron a resolver mi problema.

Con $_SERVER['DOCUMENT_ROOT'] es probable que obtenga un resultado como este: '/var/www/html/' ó '/var/www/html/example.com/'. Mientras que con __DIR__ y __FILE__ puede obtener algo parecido; con dirname( $_SERVER['DOCUMENT_ROOT'] ), dirname( __DIR__ ) ó dirname( __FILE__ ) tampoco nos resultaría lo suficiente para lograr el objetivo, que es acceder a la ruta '/var/www/' ó '/var/', o en su defecto a la ruta '/home/account/'.

Así que para ello he tenido que escribir algo rápido de código para acceder a esa ruta, pero veamos como es la función.

NOTA: a partir de la versión 7.0.0 de PHP el parámetro (int)levels fue introducido en la función dirname, con la cual se resuelve este problema propuesto haciendo uso de un número para subir o bajar en el nivel de acceso de la ruta. Por ejemplo, dirname( __DIR__, 4 ).

NOTA: esta función solo ha sido probada en ambiente Linux.

function get_docroot_no_public_html( $docroot = '', $level = 2 ) {
$root = '';
$docroot = ( !isset( $docroot ) || empty( $docroot ) || !preg_match( '/[^\s]+$/', $docroot ) )
? $_SERVER['DOCUMENT_ROOT']
: $docroot;
$r = explode( '/', $docroot );
if( is_array( $r ) ) {
for( $i=0; $i <= $level; $i++ ){
if( isset( $r[$i] ) && !empty( $r[$i] ) ) {
$root .= $r[$i]."/";
}
}
}
return '/'.$root;
}

Como se puede observar, la función permite recibir dos argumentos o parámetros que son: $docroot y $level, los cuales especifican si así lo desea, pasar una cadena con delimitadores de barra invertida ("/") para el primer argumento y un valor de número entero para el segundo argumento. Por defecto, si $docroot no está definido o está vacío se asigna $_SERVER['DOCUMENT_ROOT'] y el valor de $level se inicializa en 2.

Usando explode() se consigue armar un array que será leído para poder armar lo que será nuestra ruta deseada, que sería algo como '/home/account/' ó '/var/www/'.

Probando la función.

Para probar esta función podemos realizar los siguiente:

echo get_docroot_no_public_html();
echo "<br>";
echo get_docroot_no_public_html("");
echo "<br>";
echo get_docroot_no_public_html(" ");
echo "<br>";
echo get_docroot_no_public_html( $_SERVER['DOCUMENT_ROOT'], 3 );
echo "<br>";
echo get_docroot_no_public_html( __DIR__, 1 );
echo "<br>";
echo get_docroot_no_public_html( __FILE__, 2 );
echo "<br>";
echo get_docroot_no_public_html( dirname( $_SERVER['DOCUMENT_ROOT'] ) );
echo "<br>";
echo get_docroot_no_public_html( dirname( __DIR__ ) );
echo "<br>";
echo get_docroot_no_public_html( dirname( __FILE__ ) );

La impresión de cada línea de código resultaría en:
/var/www/
/var/www/
/var/www/
/var/www/html/
/var/
/var/www/
/var/www/
/var/www/
/var/www/

Como se puede apreciar hay diversas maneras de acceder a rutas no públicas y públicas de nuestro servidor web, dependiendo de los valores que se pasen como argumentos.

Espero que esta función les sirva tanto como a mí, que la puedan mejorar y mantener dentro de sus recursos de utilidades para PHP.
Consulta Lo+ Top de Lenguajes De Programación
Todos los titulares en un solo lugar...