Apache kullanılırken PHP'de DOCUMENT_ROOT değişkeninde tutarsız sondaki eğik çizgi


10

Farklı sunucu ortamlarında, PHP $_SERVER['DOCUMENT_ROOT']süper küresel bazen bir eğik çizgi ve bazen de yok. Bu sorunun doğrudan Apache'nin dosyada nasıl DocumentRoottanımlandığı ile ilgili olduğunu düşünürdüm httpd.conf:

Yani ben httpd.confhiçbir sondaki eğik çizgi içeriyorsa:

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

o echo $_SERVER['DOCUMENT_ROOT']zaman / var / www / live / current ifadesini vermelidir

ve eğer httpd.confsonunda eğik çizgi varsa:

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

o echo $_SERVER['DOCUMENT_ROOT']zaman / var / www / live / current /

Bu Ubuntu 10.04 için geçerlidir, ancak RHEL 5.5'te $_SERVER['DOCUMENT_ROOT']Apache'de tanımlanmamış olsa bile bir eğik çizgi eklenir .

Neden olduğuna dair fikri olan? Kaçırdığım bir yapılandırma parametresi var mı?


Referans için:

  • PHP 5.3.3 (RHEL) (sorun oluşur): PHP 5.3.3 (cli) (yapılı: 23 Tem 2010 16:26:53)
  • Ubuntu'nun PHP sürümü (sorun yok): Suhosin-Patch (cli) ile PHP 5.3.2-1ubuntu4.2 (dahili: 13 Mayıs 2010 20:03:45)

Yanıtlar:


6

Sanal sunucularınız arasındaki eğik çizginin neden değiştiğine dair hiçbir fikrim yok. Bu arada, önemli mi? Programlarınıza yeni bir eğik çizgi ekleyin (çift eğik çizgi varsa kaldırın) ve sorun çözüldü.

kullanırım

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

4
Sadece kullanabilirsiniz $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Otomatik olarak tüm çoklu eğik çizgileri ve ayrıca arkadaki çizgileri kaldırır. Her zaman bir eğik çizgi istiyorsanız, yukarıdaki çağrının sonucuna bitirin realpath(). İçinde değil.
grip

1
Aynı sorunu (php 5.5) bir Hosteurope ana bilgisayarı (Bence Ubuntu) arasında teyit edebilirim: eğik çizgi var ... ve Windows 7: eğik çizgi yok (oldukça yeni XAMPP kurulumu)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'realpath'in yapabileceği her şeyden biraz daha hızlı olmalı.
Frank Nocke


3

Apache ortamında belge kökü birden fazla yerde tanımlanabilir.

Evet, httpd.confbu ayarları içerir, ancak bu dosya varsayılan yapılandırma için kullanıldığından bunların üzerine yazılabilir.

Altında vhost yapılandırmasını vhosts.dve sites-availabledizinleri kontrol etmenizi öneririm .


2

Önerilen çözüm:

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

tüm kurulumlarda çalışmaz.

Örneğin, benim durumumda:

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

Öncekiyle aynı problem.

İlk talimatı aşağıdaki gibi değiştirmeniz gerekebilir:

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

devedikeni


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'realpath'in yapabileceği her şeyden biraz daha hızlı olmalı.
Frank Nocke

2

Dom'un cevabı bu soruna bir çözümdür, ancak stefanvesca'nın açıklaması farklı ortamlarda '//' çiftini yaşamanızın nedenidir. Yerel makinenizde, sanal ana makinenizi ayarladığınız .conf dosyanızda, büyük olasılıkla / tanımlanmış belge kökünün sonuna / eklediğiniz, diğer ortamınızı kuran kişi ise veya tam tersini yaptınız.

Her neyse, php $ _SERVER ['DOCUMENT_ROOT'] kullanırken, yapılandırmanın sonucu olan apache ortam değerini alırsınız. Bir ortamda '/', diğerinde '//' nedeni budur.


1

DOCUMENT_ROOT'un sonunda eğik çizgi olmadığı varsayılır.

Bu değer web sunucusu yapılandırmasından geçirilir

apache

DocumentRoot /var/www/html

Bu, ona eklediğimiz yola doğru eğik çizgi çizmemiz gerektiği anlamına gelir.

Yolun herhangi bir yerinde çift eğik çizgi '//' nin bir sonucu olmadığını bilmek (bir http url'sinde dosya sistemi ile ilgili olduğunda ... bazı aksaklıkların olduğu durumlar olabilir)

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

DOCUMENT_ROOT için bir eğik çizgi olduğunda, sonucu olmayan bir şey için sysadmin'i suçlayabiliriz :)

Ve güvenle yoksay?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.