2008-12-23 33 views
6

這是我最近遇到的問題 - 在虛擬主機上配置錯誤的apache。這意味着所有依靠$_SERVER['DOCUMENT_ROOT']的腳本都會中斷。我找到的最簡單的解決方法就是將變量設置在一些共享的全局包含文件中,但不要忘記它。我的問題是,如何以編程方式確定正確的文檔根目錄?如何以編程方式確定PHP中的文檔根目錄?

例如,一臺主機上,設置是這樣的:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs' 

真正的文檔根:

test.example.com -> /data/htdocs/example.com/test 
www.example.com -> /data/htdocs/example.com/www 

而且我想這是一個從www.example.com/blog/運行的腳本(上路徑/data/htdocs/example.com/www/blog)以獲得正確的值/data/htdocs/example.com/www

另一臺主機上,安裝有一點不同:

$_SERVER['DOCUMENT_ROOT'] == '/srv' 
test.example.com -> /home/virtual_web/example.com/public_html/test 
www.example.com -> /home/virtual_web/example.com/public_html/www 

是否有任何解決這個?或者是唯一的方法不要依靠$_SERVER['DOCUMENT_ROOT']並修復我在我的網站上運行的所有軟件?解決這個在主機方面似乎沒有選擇,我還沒有遇到一個主機,這是正確配置。我得到的最好的是指向www.example.com的文檔根目錄,該目錄至少位於open_basedir之內 - 他們還使用了另一個命名方案,www.example.com將指向/u2/www/example_com/data/www/

回答

2

$localpath=getenv("SCRIPT_NAME"); 
$absolutepath=getenv("SCRIPT_FILENAME"); 
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));  

我不得不改變基本名/真實路徑招,因爲它返回我的主機上的一個空字符串。相反,我使用SCRIPT_FILENAME。這可能不再適用於IIS(但使用$ _SERVER變量的原始腳本可能不會)。

0

PHP 應該可以設置當前目錄到一個腳本在,所以只要是不破,你應該能夠找出使用$_SERVER['SCRIPT_FILENAME']getcwd()文檔根目錄。 (我記不清頭頂上的所有$ _SERVER變量,在phpinfo()中可能會更有用。)

+0

我已經安裝了一些腳本是「太聰明」,知道哪個目錄(相對於理論文檔根目錄),他們正在安裝,並追加此文檔根目錄(後,他們從數據庫中得到它)。我仍然需要修改每個目錄的代碼以去除目錄...或者不是? – 2008-12-23 23:01:05

7

在PHP5中有一個神奇常量__FILE__,它包含了絕對路徑在其中出現的文件。您可以將它與dirname結合使用來計算文檔根目錄。

你可以把類似以下的聲明在配置文件中

define ('DOCUMENT_ROOT', dirname(__FILE__)); 

這應該做的伎倆

+1

訣竅是使用文件的絕對名稱(來自魔術常量或來自服務器變量),並將其與絕對路徑的知識結合起來,以實現來自SCRIPT_NAME的文檔根目錄。 – 2008-12-23 23:28:30

+3

從PHP 5.3開始,這也是`__DIR__`用來代替`dirname(__ FILE __)`。 – Michael 2012-09-11 08:00:44

+0

但是,這只是返回當前文件的文件夾,它不一定是Web服務器的實際根文件夾。 – Chuck 2017-04-27 07:32:47

3

有沒有需要修改所有腳本。

在使用auto_prepend_file運行任何腳本之前,您可以運行PHP文件。

$_SERVER只是一個數組,你可以修改它並設置正確的$_SERVER['DOCUMENT_ROOT']

0

爲什麼不要求您的網絡主機正確配置他的服務器?

這些類型的東西往往默默地留在你的代碼中,永遠不會被刪除(但仍然活躍),直到有人終於修復了服務器。這一切都會再次破裂。

或者,將你的東西移動到可以工作的主機上。如果這被打破,誰知道你會發現下一步。

2

這是一個原因爲什麼人們通過引導虹吸一切的index.php htaccess的使用和/或查詢字符串。您可以使用上面提到的dirname(__FILE__)技巧,並以這種方式獲取應用程序的公共基礎。

如果你太遠到它切換到一個單一入口點,有一件事我見過的人做的是有自己的腳本一個共同的報頭走到目錄樹找到一個文件,它是獨一無二的基地導演:

function findAppBase($dir) { 
    if(file_exists("$dir/unique_file.txt")) { 
     return $dir; 

    return findAppBase(dirname($dir)); 
} 

$base = findAppBase(dirname(__FILE__)); 

該代碼尚未經過測試,並有可能是使用$_ENV$_SERVER的瓦爾基於http://www.helicron.net/php/的巧妙方式,將你想要做什麼......

相關問題