Comment inclure un fichier en dehors de la racine du document?
Ce que je veux faire est d'inclure "file1.php" à partir de "domaine1" en "file2.php' sur 'domain2'. Donc, ce que j'ai pensé que je devrais faire quelque chose comme ceci:
file2.php
require_once '/var/www/vhosts/domain1/httpdocs/file1.php';
Mais cela ne fonctionne pas pour des raisons que je ne peux pas vraiment comprendre. Donc, ce que j'ai fait a été d'ajouter mon chemin de la chemin de. Quelque chose comme:
file2.php
set_include_path(get_include_path() . PATH_SEPARATOR . "/var/www/vhosts/domain1/httpdocs");
require_once 'file1.php';
Alors pouvez-vous me donner quelques conseils comme de l'endroit où je fais mal ?
Grâce
Mise à JOUR - de toute façon, j'obtiens le message d'erreur suivant:
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
Aussi j'ai essayé cette fois avec le safe_mode et Off.
UPDATE2: Aussi j'ai changé les permissions à 777 sur mon fichier de test et j'ai vérifié les chemins dans le fichier include dans bash.
SOLUTION: j'ai réussi à résoudre le mystère! Mon hébergeur utilise parallels Plesk panel pour gérer les domaines et à de telles. Aussi le niveau de rapport d'erreur en php.ini n'était pas E_ALL. Lorsque j'ai mis les rapports d'erreur à E_ALL j'ai reçu un avertissement en disant:
Warning: require() [function.require]: open_basedir restriction in effect.
Alors je suis allé dans /var/www/vhosts/domain2/conf/httpd.inclure et à l'édition d'open_basedir chemin. Notez que ce n'est pas une solution durable depuis ce fichier de configuration est réécrit par parallels plesk panel à chaque fois que le domaine de la config est changé. Ce que vous devez faire est de modifier (ou créer) le " serveur virtuel.conf' du fichier dans le même répertoire et de lancer:
/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=DOMAIN.TLD
Cela devrait reconfigurer les paramètres de votre domaine, mais pour une raison étrange, il ne fonctionnera pas avec open_basedir. Je peux modifier d'autres choses comme document_root mais cela ne va pas changer open_basedir, mais c'est un autre problème 😀
SOLUTION FINALE: Pour ceux qui ont le même problème voici le code final qui ont travaillé. Je viens d'ajouter ceci dans le fichier /var/www/vhosts/domain2/conf/vhost.conf (vous pouvez modifier '/var/www/vhosts' ' /' ou ce que vous voulez):
<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>
Merci à tous les gars!
Re votre mise à jour, cela sonne comme le fichier n'existe pas, ou les droits ne sont pas correctement définis. Êtes-vous à 1000% qu'elle existe? Qui n'appartient pas à l'utilisateur (utilisateur/groupe)? L'utilisateur qui fait de l'exécution de PHP?
Comment puis-je vérifier d'utilisateur que PHP utilise ?
de3.php.net/manual/en/function.posix-getuid.php et de3.php.net/manual/en/function.posix-getgid.php
Merci pour l'affichage de la solution. Donc, beaucoup de fois les gens le comprendre, et puis il suffit de la laisser avec pas de résolution. Le mal open_basedir t-il de nouveau. J'aurais du me douter que c'était le cas, nous nous occupons de tout le temps chez Yahoo. J'ai juste pensé que Yahoo était plus paranoïaque que d'autres. Je ne savais pas open_basedir a été utilisé beaucoup dans la nature. Hmmm. J'apprends quelque chose de nouveau chaque jour! haha.
OriginalL'auteur Brayn | 2010-03-03
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas accomplir cette si
open_basedir
est, en effet, qui l'empêche de PHP à partir de la traversée de répertoire de base.Ce que vous pouvez faire est de vous assurer que docroot1 et docroot2 sont détenus par les utilisateurs dans le même groupe, définissez les autorisations de groupe en conséquence et utiliser un lien symbolique à partir de docroot2 à docroot1 de lire les autres de la racine web.
Ou, re-compiler PHP et laissez simplement suivre typiques *nix autorisations comme tous les autres processus 🙂
OriginalL'auteur Tim Post
Vous pouvez inclure des fichiers à partir de n'importe où vous voulez, à moins que votre script PHP, les autorisations ou les sécurité l'empêcher. Votre première approche est parfaitement bien. Quelles erreurs avez-vous l'obtenir?
Re les commentaires, qui semblent confirmer qu'il n'y a pas d'accès de l'intérieur de PHP dans un fichier qui existe. Quant à ce qu'elle pourrait être, Suhosin ayant été écartée, la seule chose que je peux penser à est de PHP ou Apache être une sorte de un Prison chroot:
Je n'ai jamais travaillé avec quelque chose comme ça donc je ne peux pas vous dire comment le repérer (en dehors de faire un
glob()
sur/var/www/vhosts
et voir ce qui arrive. Mais je pense que cela aurait été créé par un administrateur. Qui dirige votre machine?OriginalL'auteur Pekka 웃
Cela fonctionne sur un couple de machines-je gérer
OriginalL'auteur Kristoffer Sall-Storgaard
Je suis assis ici, vous demandez-vous pourquoi Vous n'avez pas de jus faire un lien symbolique. Ou ai-je mis quelque chose?
Vous pourriez symlink un dossier avec le nécessaire comprend pour le chemin que Vous avez accès à l'.
il a mentionné la vérification de tous les fichiers dans bash, donc je m'attends à ce qu'il a accès.
J'ai essayé un lien mais il ne fonctionne pas ( j'ai mentionner que, quelque part dans les commentaires. Aussi j'ai résolu le problème et de mettre à jour le post tout à l'heure. Merci quand même!
OriginalL'auteur naugtur
Essayer chmod 777 sur un test fichier php pour voir si cela fonctionne, si il ne vous avez des problèmes d'autorisation.
Également de faire un phpinfo() pour voir si le mode économie est activé.
OriginalL'auteur douwe
ce que vous utilisez est une mauvaise pratique. mettre le code dépendant dans le domaine spécifique. Dupliquer le même code est la bonne approche, car il n'affecte pas le fonctionnement des deux sites.Essayez de créer le lien symbolique file1.php et compris que si c'est à partir du répertoire local.assurez-vous également que .htaccess a la followsymlink option est définie à trueà faire l'essai dans votre file2.php dans domaine2?
require_once '../../../domain1/httpdocs/file1.php';
La POIRE est une bibliothèque qui fera partie de l'include path par défaut. Ils sont fournis par le fournisseur d'hébergement. la meilleure approche est de toujours avoir votre dépendance à l'localement et à l'échelle mondiale dans tous les domaines. centrale de bibliothèque de code est utile seulement dans le domaine.
C'est ce que je veux faire. En fait, il existe un domaine et à un emplacement à l'extérieur de vhosts mais c'est la façon dont j'ai posté la question et par souci de clarté, je n'ai pas modifié les chemins. Merci.
avez-vous essayez de créer le lien symbolique et de l'utiliser?
Je n'ai pas essayé encore, mais il pourrait peut-être marcher. Je vais vous parler maintenant.
OriginalL'auteur coder
Ce qui se passe si vous essayez d'exiger un autre fichier:
? Si oui, mettre test.php dans l'autre endroit et essayez à nouveau. Faut-il encore travailler?
OriginalL'auteur Chuck Burgess