Barre oblique de fin incohérente dans la variable DOCUMENT_ROOT en PHP lors de l'utilisation d'Apache

10

Dans différents environnements de serveur, le PHP $_SERVER['DOCUMENT_ROOT']super global a parfois une barre oblique de fin et parfois non. J'aurais pensé que ce problème est directement lié à la façon dont Apache DocumentRootest défini dans le httpd.conffichier:

c'est-à-dire que j'aurais pensé que si httpd.confne contient aucune barre oblique:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

alors echo $_SERVER['DOCUMENT_ROOT']devrait donner / var / www / live / current

et s'il httpd.confcontient une barre oblique de fin:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

alors echo $_SERVER['DOCUMENT_ROOT']devrait donner / var / www / live / current /

C'est le cas sur Ubuntu 10.04 mais sur RHEL 5.5 une barre oblique de fin est ajoutée $_SERVER['DOCUMENT_ROOT']même si aucune n'a été définie sur Apache.

Une idée pourquoi cela se produit? Y a-t-il un paramètre de configuration qui me manque?


Pour référence:

  • PHP 5.3.3 de RHEL (un problème se produit): PHP 5.3.3 (cli) (build: 23 juillet 2010 16:26:53)
  • Version PHP d'Ubuntu (pas de problème): PHP 5.3.2-1ubuntu4.2 avec Suhosin-Patch (cli) (construit: 13 mai 2010 à 20:03:45)
À M
la source

Réponses:

6

Je ne sais pas pourquoi la barre oblique change entre vos hôtes virtuels. Au fait, est-ce important? Ajoutez simplement une nouvelle barre oblique à vos programmes (supprimez si une double barre oblique est présente) et le problème est résolu.

j'utilise

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
Dom
la source
4
Vous pouvez simplement utiliser $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Il supprime automatiquement toutes les barres obliques multiples ainsi que la dernière. Si vous voulez toujours une barre oblique de fin, concaténez-la au résultat de l'appel ci-dessus à realpath(). Pas à l'intérieur.
grippe
1
Je peux confirmer le même problème (php 5.5) entre un hôte Hosteurope (Ubuntu je pense): a slash ... et Windows 7: pas de slash (installation XAMPP assez récente)
Frank Nocke
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'devrait être légèrement plus rapide que toutes ces choses que realpath peut faire.
Frank Nocke
3

La racine du document dans un environnement Apache peut être définie à plusieurs endroits.

Oui, httpd.confcontient ces paramètres, mais ils peuvent être remplacés car ce fichier est utilisé pour la configuration par défaut.

Je vous suggère d'aller vérifier la configuration de vhost sous vhosts.det sites-availablerépertoires.

veidelis
la source
2

La solution proposée:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

ne fonctionne pas dans toutes les installations.

Par exemple, dans mon cas:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

Même problème qu'avant.

Peut-être devriez-vous modifier la première instruction dans:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

chardon

antonio
la source
1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'devrait être légèrement plus rapide que toutes ces choses que realpath peut faire.
Frank Nocke
2

La réponse de Dom est une solution à ce problème, mais la déclaration de Stefanvesca est la raison pour laquelle dans les différents environnements, vous rencontrez le double «//». Sur votre machine locale, dans votre fichier .conf où vous avez configuré votre hôte virtuel, vous avez probablement ajouté le / à la fin de la racine de document définie, tandis que la personne qui a configuré votre autre environnement ne l'a pas fait, ou vice versa.

De toute façon, lorsque vous utilisez $ _SERVER ['DOCUMENT_ROOT'] de php, vous obtenez la valeur de l'environnement apache qui est le résultat de la configuration. C'est la raison du «/» dans un environnement et du «//» dans un autre.

Ben Smith
la source
1

Je dirais qu'il est supposé que DOCUMENT_ROOT n'a pas de barre oblique de fin.

Cette valeur est transmise à partir de la configuration du serveur Web

apache

DocumentRoot /var/www/html

Cela implique que nous devrions avoir une barre oblique vers le chemin que nous y ajoutons.

Sachant qu'une double barre oblique '//' n'importe où dans le chemin n'a aucune conséquence (lorsqu'elle est liée au système de fichiers ... dans une URL http, il peut y avoir des cas où il y a des problèmes)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

Quand il y a une barre oblique vers DOCUMENT_ROOT, nous pouvons blâmer sysadmin sur quelque chose qui n'a aucune conséquence :)

Et l'ignorer en toute sécurité?

Antony Gibbs
la source