2012-06-07 68 views
10

我嚴重依賴$_SERVER["DOCUMENT_ROOT"]來獲得絕對路徑。但是,這對於URL不指向根目錄的站點不起作用。PHP在服務器中獲取網站根目錄絕對URL?

我夾中存儲的網站如:

  • site1的
  • 站點2
所有直接在根裏面

。有沒有辦法在當前站點根目錄的服務器中獲取路徑?

它應該返回:

/var/chroot/home/content/02/6945202/html/site1 // If the site is stored in folder 'site1' 
    /var/chroot/home/content/02/6945202/html // If the site is stored in the root 
+0

你想從域的根目錄獲取文檔的根目錄嗎?因爲,你在做什麼其實是對的! –

+0

我想獲得每個站點託管的服務器上的絕對路徑。 – lisovaccaro

+0

好的,'$ _SERVER [「DOCUMENT_ROOT」]'實際上是這樣,但是你得到了什麼?你已經給了你想要的。我想你需要Apache的幫助,因爲只有Apache知道哪個是虛擬主機及其地址。得到它? –

回答

11

你可以簡單地添加到dirname($_SERVER['SCRIPT_NAME'])$_SERVER['DOCUMENT_ROOT']

更新

該網站似乎是目錄「安裝」文件夾,所以SCRIPT_NAME顯然會/

因此,要做到這一點,您必須使用__DIR__dirname(__FILE__)來找出您的腳本在文件系統中的位置。

更新2

沒有單一的index.php控制器爲整個網站,這樣就不能工作。

以下表達式會執行一個字符串「subtraction」來查找公共路徑。你有一個已知的前綴(文檔根),一個未知的(根文件夾)和一個已知的後綴(腳本路徑),所以要找到前兩個,你需要完整的絕對路徑(__FILE__)並減去已知的後綴:

substr(__FILE__, 0, -strlen($_SERVER['SCRIPT_NAME'])); 

如果包含的文件需要此值,則必須在包含相關腳本之前將其存儲在常量中。 。

+0

我試着在site2 index.php中運行它,它返回:'/'。我需要它指向:'/ var/chroot/home/content/02/6945202/html/site1'這是我的網站的根。 – lisovaccaro

+0

看起來你的服務器是chrooted的,這可能會影響傳遞給PHP的變量。該路徑是您的服務器帳戶根目錄嗎? – Sp4cecat

+0

我想你忘了提到該網站被稱爲'http:// www.example.org/index.php';在這種情況下,您必須使用'__DIR__'或'dirname(__ FILE __)'並將其保持爲常量,以便包含的腳本也可以使用它。 –

1

對於未來的Google,這也爲我工作

substr(substr(__FILE__, strlen(realpath($_SERVER['DOCUMENT_ROOT']))), 0, - strlen(basename(__FILE__))); 
+3

您的解決方案基於'$ _SERVER ['DOCUMENT_ROOT']',它已被證明是平臺依賴的:在某些情況下,它是通過服務器根目錄的路徑編譯的,在其他情況下是通過站點根目錄,所以它不安全。我認爲最好的方法是依靠'$ _SERVER ['SCRIPT_NAME']'和$ _SERVER ['SCRIPT_FILENAME']'。 –

1

只需使用getcwd()當前腳本是在文件夾的當前服務器絕對路徑。

你可以在上面定義常量的網站,以便網站的其他部分可以依靠這條路徑。

define('MY_SERVER_PATH', getcwd()); 
0

使用下面的方法來從服務器設置

str_replace($_SERVER['DOCUMENT_ROOT']."/",$_SERVER['PHPRC'],$_SERVER['REAL_DOCUMENT_ROOT']) 

或使用getcwd()得到絕對根URL。它得到你的應用程序的當前工作目錄

+0

我的標準PHP 7(Fedora 25)安裝中不存在'PHPRC'和'REAL_DOCUMENT_ROOT'。 – carefulnow1