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.conf
arquivo:
ou seja, eu teria pensado que, se httpd.conf
nã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.conf
conté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)
$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 acimarealpath()
. Não dentro dele.rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
deve ser um pouco mais rápido do que todas as coisas que o caminho real pode fazer.http://httpd.apache.org/docs/2.0/mod/core.html diz: O DocumentRoot deve ser especificado sem uma barra final.
fonte
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.d
esites-available
diretórios.fonte
A solução proposta:
não funciona em todas as instalações.
Por exemplo, no meu caso:
Mesmo problema que antes.
Pode ser que você deva modificar a primeira instrução em:
cardo
fonte
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'
deve ser um pouco mais rápido do que todas as coisas que o caminho real pode fazer.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.
fonte
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?
fonte