sirve - ¿Cómo configuro una ruta de inclusión absoluta en PHP?
php tutorial (10)
En HTML, puedo encontrar un archivo comenzando desde la carpeta raíz del servidor web comenzando la ruta del archivo con "/". Me gusta:
/images/some_image.jpg
Puedo poner esa ruta en cualquier archivo en cualquier subdirectorio, y apuntará a la imagen correcta.
Con PHP, intenté algo similar:
include("/includes/header.php");
... pero eso no funciona.
Creo que esta página dice que puedo establecer include_path
una vez y después de eso, se asumirá. Pero no entiendo muy bien la sintaxis. Ambos ejemplos comienzan con un punto y dice:
Usando un . en la ruta de inclusión permite incluir relativo ya que significa el directorio actual.
Relativo incluye exactamente lo que no quiero.
¿Cómo me aseguro de que todo mi include señale a la carpeta root/includes
? (Bonificación: ¿y si quiero colocar esa carpeta fuera del directorio público?)
Aclaración
Mis archivos de desarrollo están siendo servidos actualmente por XAMPP / Apache. ¿Eso afecta el camino absoluto? (Todavía no estoy seguro de cuál será el servidor de producción).
Actualizar
No sé cuál fue mi problema aquí. El elemento include_path
que hice referencia arriba era exactamente lo que estaba buscando, y la sintaxis no es realmente confusa. Lo intenté y funciona muy bien.
Una cosa que se me ocurre es que algunas personas pueden haber pensado que "/ some / path" era una "ruta absoluta" porque suponían que el sistema operativo era Linux. Este servidor es Windows, por lo que una ruta absoluta debería comenzar con el nombre de la unidad.
De todos modos, problema resuelto! :)
Hola a todos ... tuve un problema similar con mi sistema cms. Necesitaba un camino difícil para algunos aspectos de seguridad. piensa que la mejor manera es como rob escribió. para una codificación rápida y sucia, piense que esto también funciona ... :-)
<?php
$path = getcwd();
$myfile = "/test.inc.php";
/*
getcwd () apunta a: / usr / srv / apache / htdocs / myworkingdir (como ejemplo)
echo ($path.$myfile);
would return...
/usr/srv/apache/htdocs/myworkingdir/test.inc.php
access outside your working directory is not allowed.
*/
includ_once ($path.$myfile);
//some code
?>
buen día strtok
La configuración include_path funciona como $ PATH en Unix (también hay una configuración similar en Windows). Contiene varios nombres de directorio, separados por dos puntos (:). Cuando incluye o requiere un archivo, estos directorios se buscan en orden, hasta que se encuentra una coincidencia o se buscan todos los directorios.
Por lo tanto, para asegurarse de que su aplicación siempre incluya desde su ruta si el archivo existe allí, simplemente coloque primero su directorio de inclusión en la lista de directorios.
ini_set("include_path", "/your_include_path:".ini_get("include_path"));
De esta forma, primero se busca su directorio de inclusión y luego la ruta de búsqueda original (por defecto, el directorio actual, y luego PEAR). Si no tiene problemas para modificar include_path, esta es la solución para usted.
Lo que hago es poner un archivo config.php en mi directorio raíz. Este archivo está incluido en todos los archivos PHP de mi proyecto. En ese archivo config.php, hago lo siguiente;
define( ''ROOT_DIR'', dirname(__FILE__) );
Luego, en todos los archivos, sé cuál es la raíz de mi proyecto y puedo hacer cosas como esta
require_once( ROOT_DIR.''/include/functions.php'' );
Lo sentimos, no hay puntos de bonificación por salir del directorio público;) Esto también tiene el desafortunado lado de que todavía necesita una ruta relativa para encontrar config.php, pero hace que el resto de su inclusión sea mucho más fácil.
No hay nada en include / require que le prohíba utilizar un camino absoluto. entonces tu ejemplo
include(''/includes/header.php'');
debería funcionar bien Suponiendo que la ruta y el archivo son corect y tienen los permisos correctos establecidos.
(y, por lo tanto, le permiten incluir cualquier archivo que desee, dentro o fuera de la raíz de su documento)
Sin embargo, este comportamiento se considera un posible riesgo de seguridad. Por lo tanto, el administrador del sistema puede establecer la directiva open_basedir .
Esta directiva configura dónde puede incluir / solicitar sus archivos y podría ser solo su problema.
Algunos paneles de control (plesk por ejemplo) establecen que esta directiva sea la misma que la raíz del documento de forma predeterminada.
en cuanto al ''.''
sintaxis:
/home/username/public_html <- absolute path public_html <- relative path ./public_html <- same as the path above ../username/public_html <- another relative path
No responde directamente su pregunta, sino algo para recordar:
Al utilizar includes with allow_url_include en su ini tenga en cuenta que, al acceder a sesiones desde archivos incluidos, si desde un script incluye un archivo utilizando una referencia de archivo absoluta y luego incluye un segundo archivo en su servidor local utilizando una referencia de archivo url que tienen un alcance de variable diferente y la misma sesión no se verá en ambos archivos incluidos. La sesión original no se verá desde el archivo incluido en la url.
desde: http://us2.php.net/manual/en/function.include.php#84052
Una estrategia
No sé si esta es la mejor manera, pero me ha funcionado.
$root = $_SERVER[''DOCUMENT_ROOT''];
include($root."/path/to/file.php");
Sigo el ejemplo de Wordpress en este caso. Voy y defino una ruta raíz, normalmente la raíz del documento, y luego voy a definir un montón de otras rutas junto con eso (una para cada uno de los directorios de mi clase. IE: base de datos, usuarios, html, etc.). A menudo definiré la ruta raíz manualmente en lugar de confiar en una variable de servidor.
Ejemplo
if($_SERVER[''SERVERNAME''] == "localhost") { define("ABS_PATH", "/path/to/upper/most/directory"); // Manual } else { define("ABS_PATH, dirname(__FILE__)); // This defines the path as the directory of the containing file, normally a config.php } // define other paths... include(ABS_PATH."/mystuff.php");
Gracias - este es uno de los 2 enlaces que se completan si buscas en Google la ruta absoluta de php apache windows.
Como novato en el desarrollador PHP intermediario, no entendí por qué las rutas absolutas en los sistemas apache windopws serían c: / xampp / htdocs (por defecto, raíz de documento apache - XAMPP) en lugar de /
por lo tanto, si en http // localhost / myapp / subfolder1 / subfolder2 / myfile.php quería incluir un archivo de http // localhost / myapp
Tendría que especificarlo como: include ("c: / xampp / htdocs / myapp / includeme.php") o include ("../../ includeme.php")
Y NO incluye ("/ myapp / includeme.php")
He creado una sola línea de código para configurar en cada script de php para compensar:
<?php if(!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?>
Con este edificio $ root to bee "../" sube en jerarquía desde donde se coloca el archivo. Cuando quiera incluir con una ruta de acceso absoluta, la línea será:
<?php include($root."some/include/directory/file.php"); ?>
Realmente no me gusta, parece una forma incómoda de resolverlo, pero parece funcionar independientemente del sistema en el que se ejecute php y donde sea que se coloque el archivo, haciéndolo independiente del sistema. Para acceder a los archivos fuera del directorio web, agregue algunos más ../
after $root
, por ejemplo, $root."../external/file.txt"
.
Otra opción es crear un archivo en el directorio $_SERVER[''DOCUMENT_ROOT'']
con la definición de su ruta absoluta.
Por ejemplo, si su directorio $_SERVER[''DOCUMENT_ROOT'']
es
C:/wamp/www/
crea un archivo (es decir, my_paths.php
) que contiene este
<?php if(!defined(''MY_ABS_PATH'')) define(''MY_ABS_PATH'',$_SERVER[''DOCUMENT_ROOT''].''MyProyect/'')
Ahora solo necesita incluir en cada archivo dentro de su carpeta MyProyect este archivo ( my_paths.php
), para que pueda usar MY_ABS_PATH
como una ruta absoluta para MyProject.