php - raiz - ¿Cómo incluir el archivo fuera de la raíz del documento?
incluir archivo php en html (7)
Lo que quiero hacer es incluir ''file1.php'' de ''domain1'' en ''file2.php'' en ''domain2''. Entonces, lo que pensé que debía hacer es algo como esto:
file2.php
require_once ''/var/www/vhosts/domain1/httpdocs/file1.php'';
Pero esto no funcionará por razones que realmente no puedo entender. Entonces, lo que hice fue agregar mi ruta a la ruta de inclusión. Algo como:
file2.php
set_include_path(get_include_path() . PATH_SEPARATOR . "/var/www/vhosts/domain1/httpdocs");
require_once ''file1.php'';
Entonces, ¿pueden por favor darme algunos consejos sobre dónde estoy haciendo mal?
Gracias
ACTUALIZACIÓN - De cualquier manera recibo el siguiente mensaje de error:
Fatal error: require() [function.require]: Failed opening required ''/var/www/vhosts/domain1/httpdocs/file1.php'' (include_path=''.:/php/includes:/usr/share/pear/'') in /var/www/vhosts/domain2/httpdocs/file2.php on line 4
También he intentado esto con safe_mode activado y desactivado.
ACTUALIZACIÓN2: También he cambiado los permisos a 777 en mi archivo de prueba y he verificado dos veces las rutas al archivo de inclusión en bash.
SOLUCIÓN: ¡He logrado resolver el misterio! Mi empresa de alojamiento utiliza Plesk para gestionar dominios y tal. Además, el nivel de informe de errores en php.ini no era E_ALL. Cuando configuro el informe de errores en E_ALL, recibí una advertencia que decía:
Warning: require() [function.require]: open_basedir restriction in effect.
Así que entré en /var/www/vhosts/domain2/conf/httpd.include y edité la ruta open_basedir. Tenga en cuenta que esta no es una solución duradera, ya que plesk reescribe este archivo de configuración cada vez que se cambia la configuración del dominio. Lo que debe hacer es editar (o crear) el archivo ''vhost.conf'' en el mismo directorio y luego ejecutar:
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=DOMAIN.TLD
Esto debería reconfigurar la configuración de su dominio, pero por alguna extraña razón no funcionará con open_basedir. Puedo modificar otras cosas como document_root pero no cambiará open_basedir, pero ese es otro problema: D
SOLUCIÓN FINAL: Para aquellos con el mismo problema, aquí está el código final que funcionó. Acabo de agregar esto en /var/www/vhosts/domain2/conf/vhost.conf (puedes cambiar ''/ var / www / vhosts'' a ''/'' o lo que quieras):
<Directory /var/www/vhosts/DOMAIN.TLD/httpdocs>
<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_flag safe_mode off
php_admin_value open_basedir "/var/www/vhosts"
</IfModule>
Options -Includes -ExecCGI
</Directory>
¡Gracias a todos chicos!
¿Qué pasa si intentas requerir un archivo diferente?
// test.php
<?php
echo ''Hello World'';
?>
// your file
require_once(''test.php'');
¿Eso funciona? Si es así, coloca test.php en la otra ubicación y vuelve a intentarlo. ¿Todavía funciona?
Esto funciona en un par de máquinas que manejo
ini_set("include_path",".:/hsphere/local/home/user_name/other_domain.com");
require "filename.php";
Me siento aquí preguntándome por qué no hiciste un enlace simbólico. ¿O me he equivocado con algo? Podría enlazar una carpeta con los archivos necesarios a la ruta a la que tiene acceso.
No puede lograr esto si open_basedir
está en efecto, lo que evita que PHP salga del directorio principal.
Lo que puede hacer es asegurarse de que docroot1 y docroot2 son propiedad de usuarios en el mismo grupo, establecer los permisos de grupo correspondientes y usar un enlace simbólico de docroot2 a docroot1 para leer la otra raíz web.
O, vuelva a compilar PHP y deje que siga los permisos típicos * nix como cualquier otro proceso :)
Pruebe chmod 777 en un archivo php de prueba para ver si funciona, si tiene problemas de permisos. También haga un simple phpinfo () y vea si el modo de guardar está activado.
Puede incluir archivos desde cualquier lugar que desee, a menos que los permisos de su script PHP o el modo seguro lo impidan. Tu primer acercamiento está perfectamente bien. ¿Qué errores obtienes?
Con respecto a los comentarios, parecen confirmar que no hay acceso desde PHP a un archivo que definitivamente existe. En cuanto a lo que podría ser, habiendo descartado a Suhosin, lo único que se me ocurre es que PHP o Apache son una especie de jaula chroot :
El principal beneficio de una jaula chroot es que la cárcel limitará la parte del sistema de archivos que el demonio puede ver al directorio raíz de la cárcel. Además, dado que la cárcel solo tiene que ser compatible con Apache, los programas disponibles en la cárcel pueden ser extremadamente limitados. Lo más importante es que no hay necesidad de programas root de setuid, que se pueden usar para obtener acceso a la raíz y salir de la cárcel.
Nunca he trabajado con algo como esto, así que no puedo decirle cómo detectarlos (aparte de hacer un glob()
en /var/www/vhosts
y ver qué ocurre. Pero creo que esto debería haber sido establecido por un administrador. ¿Quién maneja su máquina?
Lo que estás usando es una mala práctica. Ponga el código dependiente en dominio específico. Duplicar el mismo código es el enfoque correcto, ya que no afecta el funcionamiento de ambos sitios.
Intente crear el enlace simbólico de file1.php e incluya eso como si fuera del directorio local.
También asegúrese de que .htaccess tenga la opción followsymlink establecida en true
¿Qué tal si intentamos esto en tu file2.php en domain2?
require_once ''../../../domain1/httpdocs/file1.php'';