otro otra llamar incluir include_once funcion ejemplo desde carpeta archivo php .htaccess

incluir - llamar un archivo php desde otra carpeta



¿Cómo podemos incluir archivos php sin especificar la ruta de la subcarpeta? (10)

Normalmente usamos el siguiente código para incluir archivos php entre sí:

<?php include_once ''include/config.php''; // OR include ''include/config.php''; // OR include_once $_SERVER[''DOCUMENT_ROOT''].''include/config.php''; // ect... ?>

Pero los códigos anteriores solo se aplican si los archivos php están en el archivo raíz. Quiero decir, si movemos nuestros archivos a una subcarpeta. Necesitamos hacer un cambio en el código que incluimos en los archivos php. Por ejemplo como este:

<?php include_once ''subfolder/include/config.php''; // OR include ''subfolder/include/config.php''; // OR include_once $_SERVER[''DOCUMENT_ROOT''].''/subfolder/include/config.php''; // ect... ?>

Lo que estoy diciendo es que cuando movemos nuestros archivos php a la subcarpeta, include_once quiere ver el nombre de la subcarpeta como ( include_once ''subfolder/include/config.php''; ). Esta es una situación desafiante porque necesitamos hacer esto para la página incluida en muchos archivos.

Por ejemplo, include_once $_SERVER[''DOCUMENT_ROOT''].''/functions/includes.php''; desde index.php y también incluye este archivo includes.php de todos los archivos php como header.php, posts.php, and ajax_post.php . Está funcionando bien desde la carpeta raíz, pero si movemos los archivos en la subcarpeta, incluiremos el archivo.php sin incluir el nombre de la subcarpeta.

Quizás también sea posible hacer esto con .htaccess .

He hecho este código htaccess tal vez usted tiene una solución con htaccess. Debo decir que he intentado usar RewriteBase /subfoldername/ pero los archivos de inclusión no funcionaron.

Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} /s/+(.+?)/.php[/s?] [NC] RewriteRule ^ /%1 [R=302,NE,L] RewriteCond %{REQUEST_METHOD} !POST RewriteCond %{THE_REQUEST} /index/.php [NC] RewriteRule ^(.*)index/.php$ /$1 [L,R=302,NC,NE] RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^ - [L] RewriteRule ^group/([/w-]+)/?$ sources/group.php?group_username=$1 [L,QSA] RewriteRule ^profile/([/w-]+)/?$ sources/user_profile.php?username=$1 [L,QSA] RewriteRule ^profile/(followers|friends|photos|videos|locations|musics)/([/w-]+)/?$ sources/$1.php?username=$2 [L,QSA] RewriteRule ^admin/(.*)$ admin/index.php?page=$1 [L,QSA] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+?)/?$ $1.php [L] RewriteRule ^(.+?)/?$ index.php?pages=$1 [L,QSA]

. Mi responsabilidad es, ¿cómo podemos incluir archivos php sin nombre de subcarpeta?


Así es como lo haría.

//----- some global location like index.php if(!defined("CONFIG_PATH")) define("PATH_CONFIG", __DIR__."/include/"); //------------ then later in some other file if(!defined("CONFIG_PATH"))die("Config path is not defined."); include_once CONFIG_PATH.''config.php'';

Entonces cuando lo cambies solo actualizas

if(!defined("CONFIG_PATH")) define("PATH_CONFIG", __DIR__."/include/subfolder/");

Diría que esta es la forma "tradicional" de hacerlo, y está perfectamente bien usar una constante global para esto. No es algo que quieras cambiar en el tiempo de ejecución. Necesitas acceso a él en muchos lugares, potencialmente. Puede comprobar si se accede correctamente a sus archivos ... etc.

Muchos, muchos, marcos MVC lo hacen de esta manera exacta.



Este es un ejemplo de un enfoque que requiere sus archivos por adelantado a través de la directiva auto_prepend_file.

bootstrap.php :

<?php $require_upfront = function($dir) { require_once $dir . ''/one.php''; require_once $dir . ''/two.php''; }; $require_upfront(__DIR__ . ''/inc'');

Agregue a php config, aquí .htaccess ejemplo:

php_value auto_prepend_file "/abs/path/to/bootstrap.php"


Lo que entiendo de la respuesta https://.com/a/50632691/7362396 es que necesita incluir archivos basados ​​en el directorio del script entrypoint.

Una solución para esto sin la necesidad de Apache o php.ini auto_prepend_file podría ser usar getcwd() . Devuelve el directorio de trabajo actual, que debe ser la ruta de acceso del punto de entrada / guión principal, incluso cuando se llama en los archivos incluidos.

¿Puede probar si simplemente funciona con getcwd() lugar de $baseDir ?:

include_once getcwd().''/functions/includes.php''; include_once getcwd().''/functions/get.php'';


Ok, no soy un fanático de hacer esto, pero se hará el trabajo, como se solicita:

$newpath=""; $dirs = array_filter(glob(''*''), ''is_dir''); foreach ($dirs as $location) { $newpath .= PATH_SEPARATOR . $location; } set_include_path(get_include_path() . $newpath);

El código anterior encontrará todas las subcarpetas desde donde se ejecuta este archivo y las agregará a la ruta de inclusión actual. cambiando el globo desde:

glob(''*'')

a

glob(''includes/*'') or glob(''includes'' . DIRECTORY_SEPARATOR . ''*'')

Puede restringirlo solo a subcarpetas bajo.

Lo anterior no se ha probado, solo combiné el código, pero ilustra una forma de hacer lo que estás pidiendo.

Todavía recomendaría colocar archivos en ubicaciones determinadas en lugar de tratar de incluirlos desde cualquier lugar.


Puede usar la directiva auto_prepend_file en su archivo .htaccess para crear un archivo .php incluido antes de todos sus archivos php.

Si está utilizando mod_php , tenga esta línea en su .htaccess:

php_value auto_prepend_file "/Applications/MAMP/htdocs/script/env.php"

Tenga en cuenta que para PHP-FPM necesita tener estas líneas equivalentes en su archivo .user.ini :

auto_prepend_file = "/Applications/MAMP/htdocs/script/env.php"

Luego cree un nuevo archivo env.php en el directorio base de su proyecto con una sola línea:

<?php $baseDir = __dir__ . ''/''; ?>

Esta línea establece una variable $baseDir que tiene el valor del directorio base de su proyecto, es decir, /Applications/MAMP/htdocs/script/ OR /Applications/MAMP/htdocs/subdir/script/

Luego use esta variable $baseDir cualquier lugar donde tenga que incluir otros archivos como:

include_once $baseDir.''functions/includes.php''; include_once $baseDir.''functions/get.php'';


Si tiene el nombre del archivo único en todos los servidores, puede realizar una búsqueda de este utilizando una investigación como this .

Creo que esta solución no es mejor cuando se ejecuta una gran cantidad de este script, pero puede incluir si la función de inclusión falla, usando el método try and catch (si usa este método, vea la versión de php) o si sabe que este cambio de ruta Una vez al día puedes hacer un archivo que se inicia con la rutina.

Si creas esto, necesitas almacenar esta ruta, pero no sé si existe un método para crear una variable global. Mi solución es almacenar o en una base de datos o en un archivo.

Espero haberte ayudado.


Tienes que usar la función set_include_path() y en algún lugar de tu bootstrap.php o index.php agrega el siguiente código:

<?php $path = ''/usr/pathToYourDir''; set_include_path(get_include_path() . PATH_SEPARATOR . $path);

ahora en todas partes abajo puedes escribir esto:

include_once ''include/config.php''; // or include_once ''include/db/index.php''; // etc

Y en caso de que necesite mover su código a otro directorio, solo tiene que cambiar el valor de la ruta varibalbe $path = ''/usr/pathToYourDir''; a la nueva ruta a su directorio.


Usar Apache para arreglar tu aplicación lo está resolviendo en el nivel equivocado.

Si tiene que actualizar un grupo de archivos en su código cuando cambia la ubicación de un archivo, ese es su código que le informa que ha tomado una decisión de arquitectura errónea. Así que arregla el problema real y deja de repetirte.

Defina dónde se incluye su ubicación en un solo lugar y luego, cuando sea necesario, actualice ese lugar en consecuencia.

Una forma de hacer esto es establecer una constante en la raíz de su aplicación. Esto supone que tiene un poco de código en la raíz de su aplicación que se llama en cada página. Esto probablemente sería index.php o una secuencia de comandos incluida por index.php :

// index.php or a file included by index.php const MY_INCLUDE_PATH = __DIR__ . ''/path/to/subfolder`

Entonces sus otros scripts pueden llamar incluir usando la constante:

// some other script included to handle the page include MY_INCLUDE_PATH . ''/config.php''; include MY_INCLUDE_PATH . ''/some-other-include.php'';

Aunque si todos quieren incluir el archivo config.php , tal vez simplemente siga adelante e inclúyalo en su index.php .

Este no es un "mal" global que quieras evitar. Está utilizando constantes como se pretenden. Las constantes son parte del espacio de nombres, si está usando un espacio de nombres para su aplicación.

Esto supone que hay una subcarpeta de inclusión que a veces cambia de lugar y una secuencia de comandos que forma parte de cada solicitud. ¿Es eso correcto? Si no, por favor publique su estructura de directorio.

Una función también funcionaría, y podría incluir lógica basada en cosas como la ruta del script de llamada:

// index.php or a file included by index.php my_include_function($path) { //do stuff }

Los otros scripts podrían llamar a esta función así:

// some other script included to handle the request my_include_function(__FILE__);

Luego, cuando las cosas cambian, simplemente actualice una función en un archivo.

Todo esto supone que tienes un index.php o un script similar que maneja cada solicitud y puede ser el único punto de control para definir la función o la constante. Si ese no es el caso, ¡debería ser!

Actualizar su código para usar un enrutador ( aquí hay uno ) tomaría unos 10 minutos y podría simplificar ese archivo gnarly .htaccess que publicó.


__DIR__ es ciertamente lo que estás buscando. Úselo para proporcionar rutas relativas para los archivos requeridos. Recomiendo encarecidamente utilizar require_once o include_once para todos los archivos de la biblioteca.

include_once dirname(dirname(__DIR__))."/include/config.php";