Barra final inconsistente na variável DOCUMENT_ROOT no PHP ao usar o Apache

9

Em ambientes de servidor diferentes, o PHP $_SERVER['DOCUMENT_ROOT'] super global às vezes tem uma barra final e às vezes não. Eu teria pensado que esse problema está diretamente relacionado a como o Apache DocumentRoot é definido no arquivo httpd.conf :

i.e. Eu teria pensado que, se httpd.conf não contiver barra oblíqua:

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

então echo $_SERVER['DOCUMENT_ROOT'] deve fornecer / var / www / live / current

e se httpd.conf contiver uma barra:

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

então echo $_SERVER['DOCUMENT_ROOT'] deve fornecer / var / www / live / current /

Este é o caso do Ubuntu 10.04, mas no RHEL 5.5 uma barra final é adicionada a $_SERVER['DOCUMENT_ROOT'] , mesmo que nenhuma tenha sido definida no Apache.

Alguma idéia de por que isso acontece? Existe algum parâmetro de configuração que esteja faltando?

Para referência:

  • PHP 5.3.3 do RHEL (problema ocorre): PHP 5.3.3 (cli) (construído em: 23 de julho de 2010 16:26:53)
  • Versão PHP do Ubuntu (sem problema): PHP 5.3.2-1ubuntu4.2 com Suhosin-Patch (cli) (construído em: 13 de maio de 2010 20:03:45)
por Tom 24.08.2010 / 19:09

5 respostas

6

Não tenho ideia de por que a barra está mudando entre seus hosts virtuais. A propósito, é importante? Basta adicionar uma nova barra aos seus programas (remover se houver uma barra dupla) e o problema for resolvido.

eu uso

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
    
por 24.08.2010 / 19:27
3

link diz: O DocumentRoot deve ser especificado sem barra.

    
por 14.06.2012 / 10:31
3

O documento raiz em um ambiente Apache pode ser definido em mais de um lugar.

Sim, httpd.conf contém essas configurações, mas elas podem ser sobrescritas, pois esse arquivo é usado para a configuração padrão.

Sugiro que você vá verificar a configuração do vhost nos diretórios vhosts.d e sites-available .

    
por 16.02.2012 / 08:50
2

A resposta de Dom é uma solução para este problema, no entanto a declaração de stefanvesca é a razão pela qual nos diferentes ambientes você está experimentando o duplo '//'. Em sua máquina local, dentro do seu arquivo .conf onde você configurou seu host virtual, você provavelmente adicionou o / no final da raiz do documento definido, enquanto a pessoa que configurou seu outro ambiente não, ou vice-versa.

De qualquer forma, ao usar o $ _SERVER ['DOCUMENT_ROOT'] do php, você obtém o valor do ambiente apache, que é o resultado da configuração. Essa é a razão para o '/' em um ambiente e '//' em outro.

    
por 31.12.2013 / 04:30
1

A solução proposta:

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

não funciona em todas as instalações.

Por exemplo, no meu caso:

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

O mesmo problema de antes.

Pode ser que você modifique a primeira instrução em:

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

cardo

    
por 30.03.2011 / 11:14