2013-04-30 114 views
1

我正在使用一個LAMP服務器,並將多個站點配置爲Apache中的子域。作爲標準,每個站點/子域位於/ var/www /內的整潔目錄中。我已經告訴Apache,每個站點位於/ etc/apache2/sites-available/config文件中,使用多個VirtualHosts併爲每個站點指定DocumentRoot和ServerName。Apache&PHP:DocumentRoot無法正常工作

當我在寫一篇頁面的JavaScript,我可以引用基於站點根目錄的其他頁面,就像這樣:

include '/includes/something.js'; 

但我不能做同樣的事情在PHP。如果我想在PHP代碼的文件,我需要鍵入:

include '/var/www/site_name/includes/something.php'; 

(我仍然可以做相對引用,如../includes/something.php,但在這裏,這是題外話。)我很困惑爲什麼我需要/ var/www /,但到現在爲止只是一個煩惱。一旦我發現需要完整的目錄,我可以對它進行編碼。但是現在我試圖安裝PHPlist,每次保存設置時,我都會重定向到一個像https://phplist.mydomain.org/var/www/phplist/admin/?page=configure這樣的URL--這當然會給我一個「找不到頁面」的錯誤。

它看起來像是我的Apache/PHP設置如何處理網站根目錄。我還沒有挖掘到PHPlist代碼,並不是特別想要。但我認爲,如果我可以修復我的設置,以便我可以在不需要/ var/www /前綴的情況下將文件包含在PHP中,那麼PHPlist也將停止爲我提供超過前綴的URL。

僅供參考,以下是我的大部分Apache虛擬主機的外觀。我想我的具體問題是:1)你看到我告訴你的任何事情,需要糾正? 2)你會看什麼,或者下一步想要弄清楚這個奇怪的東西?

<VirtualHost 95.102.96.250:443> 
    ServerName phplist.mydomain.org 
    DocumentRoot /var/www/phplist 
    ServerAdmin [email protected] 

    <Directory /var/www/phplist/> 
    Options +FollowSymLinks 
    AllowOverride All 
    order allow,deny 
    allow from all 
    </Directory> 

</VirtualHost> 

希望這只是我的一個基本誤解。我試過RingTFM,但一直沒有弄清楚這裏發生了什麼。提前致謝!

回答

2

$_SERVER['DOCUMENT_ROOT']也只能解析到任何的DocumentRoot是Apache的設置。您不應在共享服務器或虛擬主機環境中使用$_SERVER['DOCUMENT_ROOT'],因爲您可能並不總是擁有正確的目錄。

建議在索引文件中你使用類似

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

是這將創建一個全局定義DOCUMENT_ROOT總是正確地指向您的應用程序的根目錄。

3

Javascript是一種客戶端腳本語言。因此,當您的瀏覽器處理您的請求URI(從瀏覽器到服務器的消息)時,您的瀏覽器會將/作爲您網域的根。

PHP是一種服務器端語言,所以它需要知道文件的路徑。您可以使用相對路徑將文件包含在相同的文件夾中。這個例子是裏面包含的文件夾:

// so /includes/header.php might include /includes/config.php like this 
include('config.php'); 

這是最好的,包括了像這樣使用服務器代碼移動路徑瓦爾:

include($_SERVER['DOCUMENT_ROOT'].'/includes/config.php'); 

你可能爲了便於編程着想作出$includes_dir變量:

$includes_dir = $_SERVER['DOCUMENT_ROOT'].'/includes'; 
include($includes_dir.'/config.php'); 
2

一些基於它們工作方式的虛擬服務器不使用$_SERVER['DOCUMENT_ROOT']指向共享主機文檔根目錄,它們指向/ var/www,這是不正確的。但他們提供$_SERVER['VIRTUAL_DOCUMENT_ROOT']這是你應該檢查的東西。