Apache & DocumentRoot

redah75

Membre actif
21 Juillet 2005
228
2
42
Bonjour tout le monde et meilleurs voeux ;)

j'ai une toute petite question a la quelle je ne trouve pas de reponse!!

je suis sous snow leopard, j'ai installé different serveur pour multiples sites:
1- j'ai ajouté a la fin du fichier httpd.conf les lignes suivntes
Bloc de code:
NameVirtualHost *:80

<VirtualHost *:80>
  DocumentRoot "/Users/Redani/Sites"
  ServerName localhost
</VirtualHost>

<VirtualHost *:80>
  DocumentRoot "/Users/Redani/Sites/mon-site/www"
  ServerName mon-site.localhost
</VirtualHost>

Include /private/etc/apache2/other/*.conf

2- puis dans le fichier etc/hosts:
Bloc de code:
127.0.0.1	localhost
127.0.0.1	mon-site.localhost
tout marche bien, mais mon probleme c'est qu'il m'affiche pas les images lorsque je les affiches avec un $_SERVER['DOCUMENT_ROOT']. quand je regarde le code source il me met le chemin suivant: <img src="/Users/Redani/Sites/mon-site/www/img/mon-image.png">

j'ai pourtant demandé dans le httpd.conf a ce que la racine soit /Users/Redani/Sites/mon-site/www

auriez vous une solution svp?

MErci beaucoup
 
Salut

Tu lui demande d'afficher le Document Root, il t'affiche donc "/Users/Redani/Sites/mon-site/www", c'est ce qui est défini dans ta configuration de virtual host, c'est la valeur de la variable...

Par exemple écrit cela dans un fichier php et regarde ce que te répond le serveur :
<?=$_SERVER['DOCUMENT_ROOT']?>
Il devrait te répondre "/Users/Redani/Sites/mon-site/www"

Met tout simplement un slash "/" à la place de ta commande $_SERVER['DOCUMENT_ROOT'] et il t'affichera l'image par rapport à la racine de ton virtual host.
 
Merci westindies972 pour ta reponse.
une petite question qui n'a rien a voir avec le sujet, c'est quoi <?= ?? quelle est la difference entre <?= et <?php ???

Met tout simplement un slash "/" à la place de ta commande $_SERVER['DOCUMENT_ROOT'] et il t'affichera l'image par rapport à la racine de ton virtual host.
au fait je ne peux pas mettre un slash car c'est pour une utilisation de la fonction glob() de PHP et je ne peux pas mettre un slash pour indiquer la racine...
 
Merci westindies972 pour ta reponse.
une petite question qui n'a rien a voir avec le sujet, c'est quoi <?= ?? quelle est la difference entre <?= et <?php ???
<? est équivalent à <?php sous réserve que les tags courts soient activés
<?=$variable ?> c'est équivalent à <? echo $variable ?>
Et c'est beaucoup plus pratique et beaucoup plus lisible, surtout quand tu utilises des mécanismes de templates html comme ceux de zend (les vues) dans lesquels tu souhaites avoir le moins possible de code php.
 
cool, merci ;)
les espaces et point-virgule ne sont pas obligatoires??
<?=$variable ?> ---> <?= $variable; ?>

et sinon, tu n'aurais pas une idee sur mon probleme de document root??
 
comme je l'ai expliqué plus haut, j'utilise la fonction glob() de PHP et je ne peux pas mettre le slash au debut: glob("/img/*"); d'où l'interet d'utiliser $_SERVER['DOCUMENT_ROOT'] mais qui me pose probleme.
l'ideal pour moi serait donc que $_SERVER['DOCUMENT_ROOT'] me retourne "/www/" ou similaire
 
Je ne suis pas dev mais je viens de regarder la doc et je ne vois pas en quoi ça gênerait. :confused:

Il suffit de soutraire le $_SERVER['DOCUMENT_ROOT'] du src de l'image non?
 
justement, je n'ai rien compris, lorsque je veux afficher mon image avec le chemin suivant: <img src="/Users/Redani/Sites/mon-site/www/img/image.png">, Safari, ne me l'affiche pas!! vas comprendre pourquoi :)
 
Évidemment qu'il te l'affiche pas, pour un navigateur web une adresse qui commence par "/" désigne un chemin relatif par rapport à la racine du site web. Donc là il cherche à accéder à
mon-site.localhost/Users/Redani/Sites/mon-site/www/img/image.png
Et évidemment ce fichier là n'existe pas.
Alors soit tu mets un vrai chemin relatif, donc sans utiliser DOCUMENT_ROOT, soit tu tapes l'adresse sans passer par le server web en rajoutant file:// devant mais ce serait bien bien dégueulasse.

---------- Nouveau message ajouté à 20h34 ---------- Le message précédent a été envoyé à 20h32 ----------

les espaces et point-virgule ne sont pas obligatoires??
<?=$variable ?> ---> <?= $variable; ?>
Quand tu mets <?="hello world" ?> y'a pas de point virgule non. En revanche si tu mets juste <? echo "hello world"; ?> normalement si, j'ai fais une faute, enfin j'ai pas testé peut-être qu'avec une ligne ça peut passer sans.
 
videmment qu'il te l'affiche pas, pour un navigateur web une adresse qui commence par "/" désigne un chemin relatif par rapport à la racine du site web. Donc là il cherche à accéder à
mon-site.localhost/Users/Redani/Sites/mon-site/www/img/image.png
Et évidemment ce fichier là n'existe pas.
mais dans ce cas la, pourquoi
Bloc de code:
require_once($_SERVER['DOCUMENT_ROOT']."/inc/fichier.php");
fonctionne parfaitement???

Quand tu mets <?="hello world" ?> y'a pas de point virgule non. En revanche si tu mets juste <? echo "hello world"; ?> normalement si, j'ai fais une faute, enfin j'ai pas testé peut-être qu'avec une ligne ça peut passer sans.
j'ai lu cet apres midi que <?= fait partie du short_tag et qu'il vaut mieux utiliser <?php pour des raisons de securite. aussi que short_tag_open sera supprime de PHP6 et donc par default a off!!

qu'en penses tu?
 
mais dans ce cas la, pourquoi
Bloc de code:
require_once($_SERVER['DOCUMENT_ROOT']."/inc/fichier.php");
fonctionne parfaitement???

En developpement web, il faut differencier deux choses pour mieux comprendre. Ce qui se passe cote server, et ce qui se passe cote client.

TOUTES les commande PHP s'executent du cote serveur. En gros, du code php generera l'html qui sera lu par le navigateur (cote client)

Un require est du code php donc ton document root va bien charger le fichier car on est encore sur le server.

mais en utilisant le document root pour chercher l'image, le php je fais "qu'imprimer" ce chemin dans le code source et l'envoie au navigateur.

Quand le navigateur recoit ce qu'il doit afficher il n'y a plus de php dedans, ce n'est que du html donc le chemin /Users/Redani/Sites/mon-site/www/img/image.png

Pour un navigateur, un chemin commencant par "/" indique la racine du site web et va comme on te l'a indique plus haut chercher http://mon-site.localhost/Users/Redani/Sites/mon-site/www/img/image.png et non la racine du serveur.

Pour ton histoire de glob, il faut a partir d'ou tu appelles cette fonction.

Si le fichier qui appelle la fonction glob est au meme niveau que ton dossier image, il faut faire comme ceci. glob("img/*);


P.S: desole pour les accents m'ai je n'ai qu'un qwerty au taff
 
...
mais en utilisant le document root pour chercher l'image, le php je fais "qu'imprimer" ce chemin dans le code source et l'envoie au navigateur.

Quand le navigateur recoit ce qu'il doit afficher il n'y a plus de php dedans, ce n'est que du html donc le chemin /Users/Redani/Sites/mon-site/www/img/image.png
...
ca je le sais tres bien et je fais bien la difference entre le cote client/serveur ;)

mais ce que je ne comprend pas c'est que quelque soit le resultat renvoyé par $_SERVER['DOCUMENT_ROOT'] pourquoi
require_once($_SERVER['DOCUMENT_ROOT']."/inc/fichier.php"); fonctionne bien et
require_once($_SERVER['DOCUMENT_ROOT']."/img/image.png"); ne fontionne pas!!

le code html donnera:
inclusion du fichier /Users/Redani/Sites/mon-site/www/inc/fichier.php
et affichage de l'image /Users/Redani/Sites/mon-site/www/img/mon-image.png

lorsque je tape "/Users/Redani/Sites/mon-site/www/img/mon-image.png" dans l'url de mon navigateur, l'image est bien affiché ce qui prouve que le chemin est bon.

Si le fichier qui appelle la fonction glob est au meme niveau que ton dossier image, il faut faire comme ceci. glob("img/*);
je dois mettre un chemin absolu car la fonction glob() est utilisée dans un fichier php qui peut etre inclus dans different niveau d'arborescence du site...
 
lorsque je tape "/Users/Redani/Sites/mon-site/www/img/mon-image.png" dans l'url de mon navigateur, l'image est bien affiché ce qui prouve que le chemin est bon.
L'image s'affiche car ton navigateur vas la chercher par rapport à la racine de ton ordinateur. Mais par contre ce chemin n'est pas bon par rapport à la racine de ton virtual host !!!!!.

Si tu tape l'adresse suivante dans ton navigateur, en se basant sur ton virtual host, l'image ne s'affichera pas
Bloc de code:
http://mon-site.localhost/Users/Redani/Sites/mon-site/www/img/mon-image.png
C'est comme si ton image se trouvait dans le répertoire suivant sur ton ordinateur :
Bloc de code:
/Users/Redani/Sites/mon-site/www/Users/Redani/Sites/mon-site/www/img/mon-image.png
 
L'image s'affiche car ton navigateur vas la chercher par rapport à la racine de ton ordinateur. Mais par contre ce chemin n'est pas bon par rapport à la racine de ton virtual host !!!!!
mais ce que je veux dire c'est que lorsque je fais un click droit, afficher code source, l'image a bien comme chemin"/Users/Redani/Sites/mon-site/www/img/mon-image.png" mais qui n'est pas affichée dans le navigateur!! c'est ca le grand mystere pour moi!! ou peut etre que quelque chose d'autre m'echape!!
et pourquoi le meme chemin marche pour les include() ou require() !!
 
mais ce que je veux dire c'est que lorsque je fais un click droit, afficher code source, l'image a bien comme chemin"/Users/Redani/Sites/mon-site/www/img/mon-image.png" mais qui n'est pas affichée dans le navigateur!! c'est ca le grand mystere pour moi!!

Le chemin de ton image, dans ton code html, devrai être "/img/mon-image.png", c'est ça qui t'échappes, le src de l'image doit être en rapport avec la racine de ton virtual host et non de ton ordinateur. Le code source dans le navigateur c'est le coté client, tout se base par rapport à la racine du site.

et pourquoi le meme chemin marche pour les include() ou require() !!
Le code PHP est le coté serveur, c'est pour cela que fonctionne pour les include() ou require(). Relis bien le post de Gz', il explique tout cela.
 
mais ce que je veux dire c'est que lorsque je fais un click droit, afficher code source, l'image a bien comme chemin"/Users/Redani/Sites/mon-site/www/img/mon-image.png" mais qui n'est pas affichée dans le navigateur!! c'est ca le grand mystere pour moi!! ou peut etre que quelque chose d'autre m'echape!!
et pourquoi le meme chemin marche pour les include() ou require() !!
Quand tu tapes une adresse à la main dans le navigateur, il la prend obligatoirement comme une adresse absolue. Quand tu places cette adresse dans une page web, le lien est interprété comme étant relatif par rapport à la page web dans laquelle il se trouve, ce comportement est tout à fait normal. Mais de toutes façons, tu dois passer par le serveur web, et non pas aller lire directement l'image sur le disque.
 
j'ai lu cet apres midi que <?= fait partie du short_tag et qu'il vaut mieux utiliser <?php pour des raisons de securite. aussi que short_tag_open sera supprime de PHP6 et donc par default a off!!
Je vois pas bien en quoi il y a un problème de sécurité... À ma connaissance c'était juste un problème mineur avec les en-têtes xml. Je sais que l'utilisation de ce tag est déconseillée, mais je n'étais pas au courant qu'ils souhaitaient le supprimer, enfin après faut voir, php6 aux dernières nouvelles c'était à moitié à l'abandon... Je sais pas où ils en sont, et m'est avis que ce genre de choix n'est pas définitif.
Le supprimer sans proposer d'alternative, ce serait un peu con. php pèche franchement sur ce point, il manque un vrai équivalent à jstl et aux EL java. On n'a pas bcp de moyens propres pour faire une vue html sans avoir des tonnes de code php au milieu, et c'est très mauvais pour la lisibilité du code.