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

10

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

ou seja, eu teria pensado que, se httpd.confnão contém barra:

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

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

e se httpd.confcontém uma barra à direita:

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

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

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

Alguma idéia de por que isso acontece? Existe um parâmetro de configuração que estou ausente?


Para referência:

  • PHP 5.3.3 do RHEL (ocorre um problema): PHP 5.3.3 (cli) (compilado: 23 de julho de 2010 16:26:53)
  • Versão PHP do Ubuntu (sem problemas): PHP 5.3.2-1ubuntu4.2 com Suhosin-Patch (cli) (compilado: 13 de maio de 2010 20:03:45)
Tom
fonte

Respostas:

6

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

eu uso

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);
Dom
fonte
4
Você poderia simplesmente usar $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Ele remove automaticamente todas as várias barras e também a barra final. Se você sempre deseja uma barra final, concatene-a com o resultado da chamada acima realpath(). Não dentro dele.
flu
1
Posso confirmar a mesma questão (php 5.5) entre um host HOSTEUROPE (Ubuntu eu acho): tem barra ... e Windows 7: nenhuma barra (instalação razoavelmente recente XAMPP)
Frank Nocke
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'deve ser um pouco mais rápido do que todas as coisas que o caminho real pode fazer.
27615 Frank Nocke
3

A raiz do documento em um ambiente Apache pode ser definida em mais de um local.

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

Eu sugiro que você verifique a configuração do vhost em vhosts.de sites-availablediretórios.

veidelis
fonte
2

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"

Mesmo problema que antes.

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

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

cardo

antonio
fonte
1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'deve ser um pouco mais rápido do que todas as coisas que o caminho real pode fazer.
27615 Frank Nocke
2

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

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

Ben Smith
fonte
1

Eu diria que é assumido que DOCUMENT_ROOT não tem barra.

Este valor é passado da configuração do servidor da web

apache

DocumentRoot /var/www/html

Isso implica que devemos ter uma barra no caminho que adicionamos a ela.

Sabendo que uma barra dupla '//' em qualquer lugar do caminho não tem conseqüências (quando relacionada ao sistema de arquivos ... em um URL http, pode haver casos em que há algumas falhas)

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

Quando existe uma barra no DOCUMENT_ROOT, podemos culpar o administrador de sistemas por algo que não tem conseqüências :)

E com segurança ignorá-lo?

Antony Gibbs
fonte