verificar soporta sistema simbólicos simbolico permiten para fuertes enlaces enlace eliminar duros directorios crear comando archivos php path symlink

php - soporta - no se permiten enlaces fuertes para directorios



¿Cómo obtener la ruta original de un enlace simbólico en PHP? (4)

Tengo varios archivos en mi carpeta web, incluidos estos dos:

  • /mydocroot/include/somesubdir/include.inc.php
  • /mydocroot/include/settings.inc.php

donde somesubdir es un enlace simbólico a otro directorio en mi disco, a una ruta llamada, eh, digamos / anywhere / else .

Dentro de include.inc.php , algo así está escrito:

<?php require_once "../settings.inc.php"; ?>

En mi opinión, eso debería incluir /mydocroot/include/settings.php ... Pero adivina qué sucede: PHP intenta incluir /anywhere/settings.inc.php , en lugar de /mydocroot/include/settings.inc.php .

Parece que PHP resuelve automáticamente los enlaces simbólicos.

¿Cómo puedo evitar esto e incluir mi archivo settings.inc.php ?


Acabo de tener un problema similar. Puede hacerlo utilizando la variable $_SERVER[''SCRIPT_FILENAME''] , que muestra el archivo solicitado, por lo que en su caso será /mydocroot/include/somesubdir/include.inc.php , incluso si somesubdir es un enlace simbólico. Para incluir un archivo que es un nivel más bajo en lugar de hacer

require_once "../settings.inc.php";

hacer esto:

require_once dirname(dirname($_SERVER[''SCRIPT_FILENAME''])).DIRECTORY_SEPARATOR."settings.inc.php"

Documentación sobre las variables $_SERVER


La solución es crear una variable basepath. La mejor manera de hacerlo es incluir lo siguiente en la parte superior de su script y luego hacer referencia a él

$basepath = dirname(dirname($_SERVER[''SCRIPT_FILENAME''])).DIRECTORY_SEPARATOR;

A continuación, puede hacer referencia al camino base en sus inclusiones, necesidades, etc. Por lo tanto,

include "../myscript.php";

Se convertiría,

include $basepath."myscript.php";

Si vuelves a marcar, tendrás esto:

include "../../myscript.php";

Se convertiría,

include $basepath."../myscript.php";

Debe anidar las funciones dir_name dos veces, más una vez más por cada carpeta adicional que necesite revertir. DEBE regresar a la carpeta donde existe el enlace simbólico.

Considero que este problema es un gran defecto de diseño con PHP. No puedo pensar en una sola instancia en la que sea deseable acceder a los archivos copiados con respecto al archivo real. En todas las situaciones, incluido el alojamiento virtual, SÓLO tiene sentido retroceder a lo largo de la ruta vinculada, nunca la ruta de destino.


La solución más directa es usar siempre rutas absolutas. Hay varias maneras de hacerlo, desde codificar la ruta cada vez que la necesita, hasta codificarla una vez en la parte superior de la secuencia de comandos y hacer referencia a eso, para resolverla dinámicamente y configurarla una vez en la parte superior de su guión.

La tercera opción es lo que la mayoría de los CMS de plataforma utilizan para poder ejecutar sin un conocimiento completo de la estructura de su archivo.

¿Por qué es que estás usando un directorio simbólicamente vinculado de esta manera?


Puede usar is_link para verificar si un archivo es un enlace simbólico. Si es así, use readlink para obtener el objetivo absoluto.

Pero, en diez años de desarrollo de PHP, nunca he tenido motivos para usar enlaces simbólicos. Como sugiere Jason, siempre he definido o deducido una ruta absoluta una vez, luego la utilicé en toda mi aplicación para hacer que todas las rutas de archivos sean absolutas.