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 DocumentRoot
est défini dans le httpd.conf
fichier:
c'est-à-dire que j'aurais pensé que si httpd.conf
ne 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.conf
contient 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)
$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.rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
devrait être légèrement plus rapide que toutes ces choses que realpath peut faire.http://httpd.apache.org/docs/2.0/mod/core.html dit: Le DocumentRoot doit être spécifié sans barre oblique de fin.
la source
La racine du document dans un environnement Apache peut être définie à plusieurs endroits.
Oui,
httpd.conf
contient 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.d
etsites-available
répertoires.la source
La solution proposée:
ne fonctionne pas dans toutes les installations.
Par exemple, dans mon cas:
Même problème qu'avant.
Peut-être devriez-vous modifier la première instruction dans:
chardon
la source
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
devrait être légèrement plus rapide que toutes ces choses que realpath peut faire.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.
la source
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é?
la source