Barra diagonal inconsistente en la variable DOCUMENT_ROOT en PHP cuando se usa Apache

10

En diferentes entornos de servidor, el $_SERVER['DOCUMENT_ROOT']súper global de PHP a veces tiene una barra diagonal final y otras no. Pensé que este problema está directamente relacionado con cómo DocumentRootse define Apache en el httpd.confarchivo:

es decir, habría pensado que si httpd.confno contiene una barra diagonal final:

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

entonces echo $_SERVER['DOCUMENT_ROOT']debería dar / var / www / live / current

y si httpd.confcontiene una barra inclinada final:

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

entonces echo $_SERVER['DOCUMENT_ROOT']debería dar / var / www / live / current /

Este es el caso en Ubuntu 10.04 pero en RHEL 5.5 se agrega una barra inclinada, $_SERVER['DOCUMENT_ROOT']incluso si no se definió ninguno en Apache.

¿Alguna idea de por qué sucede esto? ¿Hay un parámetro de configuración que me falta?


Para referencia:

  • PHP 5.3.3 de RHEL (se produce un problema): PHP 5.3.3 (cli) (construido: 23 de julio de 2010 16:26:53)
  • Versión PHP de Ubuntu (sin problemas): PHP 5.3.2-1ubuntu4.2 con Suhosin-Patch (cli) (construido: 13 de mayo de 2010 20:03:45)
Tom
fuente

Respuestas:

6

No tengo idea de por qué la barra está cambiando entre sus hosts virtuales. Por cierto, ¿es importante? Simplemente agregue una nueva barra diagonal a sus programas (elimínela si hay una barra doble) y el problema se resuelve.

yo suelo

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
Dom
fuente
44
Simplemente podrías usar $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Elimina automáticamente todas las barras múltiples y también la final. Si siempre desea una barra inclinada final, coníquela al resultado de la llamada anterior a realpath(). No dentro de ella.
gripe
1
Puedo confirmar el mismo problema (php 5.5) entre un host Hosteurope (Ubuntu creo): tiene una barra inclinada ... y Windows 7: sin barra oblicua (instalación XAMPP bastante reciente)
Frank Nocke
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'debería ser un poco más rápido que todas esas cosas que Realpath puede hacer.
Frank Nocke
3

La raíz del documento en un entorno Apache se puede definir en más de un lugar.

Sí, httpd.confcontiene estas configuraciones, pero se pueden sobrescribir ya que este archivo se usa para la configuración predeterminada.

Te sugiero que revises la configuración de vhost en vhosts.dy sites-availabledirectorios.

veidelis
fuente
2

La solución propuesta:

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

no funciona en todas las instalaciones.

Por ejemplo, en mi caso:

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

El mismo problema que antes.

Es posible que deba modificar la primera instrucción en:

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

cardo

antonio
fuente
1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'debería ser un poco más rápido que todas esas cosas que Realpath puede hacer.
Frank Nocke
2

La respuesta de Dom es una solución a este problema, sin embargo, la declaración de stefanvesca es la razón por la cual en los diferentes entornos experimenta el doble '//'. En su máquina local, dentro de su archivo .conf donde configuró su host virtual, probablemente agregó el / al final de la raíz del documento definido, mientras que la persona que configuró su otro entorno no lo hizo, o viceversa.

De todos modos, cuando se usa $ _SERVER ['DOCUMENT_ROOT'] de php se obtiene el valor del entorno apache que es el resultado de la configuración. Esa es la razón de la '/' en un entorno y '//' en otro.

Ben Smith
fuente
1

Diría que se supone que DOCUMENT_ROOT no tiene una barra diagonal final.

Este valor se pasa de la configuración del servidor web

apache

DocumentRoot /var/www/html

Eso implica que deberíamos tener una barra diagonal al camino que le agreguemos.

Sabiendo que una barra doble '//' en cualquier parte de la ruta no tiene consecuencias (cuando se relaciona con el sistema de archivos ... en una URL http, podría haber casos en los que haya algunos problemas técnicos)

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

Cuando hay una barra inclinada final a DOCUMENT_ROOT, podemos culpar a sysadmin de algo que no tiene consecuencias :)

Y con seguridad ignorarlo?

Antony Gibbs
fuente