2008-11-03 6 views
14

Voici la structure de répertoirelien php fichier image répertoire web par défaut

/domain.com 
/public_html 
    /functions 
    /image 
    /mobile 
    /www 

le dossier /domain.com/public_html/www a un fichier index.php le répertoire web par défaut est/utilisateur/public_html/www dans le fichier d'index est un include qui inclut les fonctions avec include "../ functions/function.inc" cela fonctionne sans problème lorsque je veux lier à une image dans le dossier de l'image que je ne reçois pas par exemple par exemple

<img src="../image/graphic/logo.gif" alt="alt text"/> 

Est-ce que quelqu'un a une idée pourquoi le lien vers l'image ne fonctionne pas et comment lier correctement au fichier image?

J'ai essayé <img src="<?php echo $_SERVER['PHP_SELF']; ?>../image/graphic/logo.gif" alt="alt text"/>

mais qui me donne le même résultat quand je construis un lien autour de l'image pour accéder aux propriétés que je reçois cela comme chemin http://domain.com/image/pc/tattoo_small/small_2008_10_22_001.JPG le chemin doit être http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG lorsque je tente pour accéder directement à cette url http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG je reçois un car le répertoire Web par défaut fichier 404 introuvable erreur est /domain.com/public_html/www J'ai essayé http://domain.com/../image/pc/tattoo_small/small_2008_10_22_001.JPG pour obtenir le dossier de l'image, mais cela n'aide pas non plus.

Quelqu'un a-t-il des idées ou est-il impossible de créer un lien html vers des fichiers graphiques en dehors du répertoire web par défaut?

Merci de lire ce loin

Merci pour les réponses à ce jour. Je vais essayer de résoudre mon problème avec l'une des solutions recommandées et signaler ma solution de travail ici. Je souhaitais que le dossier image se trouve au même niveau que le dossier www et mobile car certaines images utilisées pour la version pc (www) et la version mobile sont identiques. Bien sûr, il est plus facile de simplement obtenir un dossier d'images dans le www et dans le dossier mobile et je pense que c'est ce que je vais faire.

merci à tous pour le conseil. La raison principale pour laquelle je ne vais pas travailler avec un script est qu'un script sera une solution difficile à un problème facile et aussi parce que je ne vois pas vraiment comment vous pouvez envelopper votre image dans une classe css et comment fournir alt texte pour une image.

Répondre

9

Vous ne pouvez pas afficher une page en dehors du répertoire Web car le chemin d'accès ne fonctionne pas, par exemple http://mydomain.com/../page.html se réfère simplement à un emplacement inaccessible.

Si vous voulez vraiment servir des fichiers (statiques) qui sont en dehors du webroot, vous pouvez écrire un petit script PHP pour les lire et les sortir. Ainsi, vous redirigiez les requêtes vers le script PHP, et PHP lisait le fichier approprié à partir du disque et le renvoyait.

+3

Et vous voudriez le faire VRAIMENT soigneusement ou vous présenterez un trou de sécurité massif :) –

1

Il est impossible de lier directement un fichier en dehors de la zone Web accessible du serveur Web.

Cependant, vous pouvez écrire un script PHP qui images proxy pour vous

<img src="my_php_proxy.php"> 

parce que PHP peut envoyer des données d'image ainsi que HTML. Cette "image" PHP n'est pas limitée au même dossier que le contenu accessible sur le Web, elle peut accéder à n'importe quel fichier lisible sur le serveur. Voir http://www.electrictoolbox.com/image-headers-php/ pour plus d'informations

27

Il n'est pas possible d'accéder directement aux fichiers en dehors du site Web; C'est une restriction de sécurité intégrée qui est là pour une bonne raison.

Il est cependant possible d'utiliser un script PHP pour servir ces images pour vous. De cette façon, vous pouvez appeler une image comme:

/image.php?file=myfile.jpg 

et utiliser file_get_contents() pour obtenir le contenu du fichier et les imprimer sur votre navigateur. Vous devriez également envoyer les en-têtes au client, dans ce cas en utilisant la fonction header() de PHP. Un court exemple:

<?php 

    $file = basename(urldecode($_GET['file'])); 
    $fileDir = '/path/to/files/'; 

    if (file_exists($fileDir . $file)) 
    { 
     // Note: You should probably do some more checks 
     // on the filetype, size, etc. 
     $contents = file_get_contents($fileDir . $file); 

     // Note: You should probably implement some kind 
     // of check on filetype 
     header('Content-type: image/jpeg'); 

     echo $contents; 
    } 

?> 

l'aide d'un script pour ce qui a encore plus d'avantages:

  • Vous pouvez suivre vos téléchargements et mettre en œuvre un compteur, par exemple
  • Vous pouvez limiter les fichiers aux utilisateurs authentifiés
  • ... etc
+4

Votre script a un trou de sécurité majeur: il devrait utiliser quelque chose comme $ file = basename (urldecode ($ _ GET ['file '])). Sinon, cela pourrait fonctionner: /image.php?file=../../../../../../../../etc/passwd – Piskvor

+1

Non selon [http: // php .net/manual/fr/function.urldecode.php] (http://php.net/manual/fr/function.urldecode.php) 'Utiliser urldecode() sur un élément dans $ _GET ou $ _REQUEST pourrait avoir des résultats dangereux. –

0

Vous pouvez faire un lien vers le répertoire d'image à l'intérieur du public___html , déplacez le répertoire de l'image vers public_html ou, si vous avez un goût particulier pour les solutions alambiquées, vous pouvez écrire un script qui lit le fichier image et le renvoie à l'utilisateur (bien sûr, sauf si vous faites une liste blanche de toutes les images, pourrait avoir un problème de sécurité potentiel entre vos mains).

16

Si vous utilisez Apache comme serveur, vous pouvez le configurer un alias un répertoire dans httpd.conf ...

<IfModule mod_alias.c> 

    Alias /images/ "/User/Public_html/Image/" 

    <Directory "/User/Public_html/Image"> 
     Options Indexes MultiViews 
     AllowOverride None 
     Order allow,deny 
     Allow from all 
    </Directory> 

</IfModule> 

IIRC, le dossier crénelage n'a pas besoin d'être dans le Webroot.

+1

Cela m'a donné "NetworkError: 403 Interdit" pour les images. Toute suggestion? – Sadee

5

Créez un lien symbolique à l'intérieur de la racine Web pointant vers le répertoire souhaité.

cd public_html 
ln -s ../images 

a besoin Apache Options +FollowSymlinks directive de configuration pour que cela fonctionne (vous pouvez le placer dans .htaccess dans votre racine Web). L'écriture d'un script PHP qui sert des fichiers provenant d'une racine Web externe annule l'objectif de la racine Web. Vous devrez vérifier les chemins très attentivement pour éviter d'exposer tout le disque sur le Web.

Questions connexes