2011-03-29 93 views
1

我試圖動態檢測我的頁面的根目錄,以便指向特定的腳本。如何檢測應用程序根目錄的路徑?

echo ($_SERVER['DOCUMENT_ROOT']); 

它打印/myName/folder/index.php

我想在一個HTML文件,以用於輸入一定的腳本是這樣的:

<a href="<?php $_SERVER['DOCUMENT_ROOT'].'lib/logout.php'?>">log out</a> 

這似乎語法錯誤,路徑未成功解決。

什麼是正確的方法來檢測到logout.php的路徑?

在不同的詞語同樣的問題:

我怎樣才能可靠地實現路徑的根目錄(其中包含我的index.php)從任何子目錄?無論html文件是在/ lib /子文件夾還是在/ anotherDirectory中,我希望它有一個指向/lib/logout.php的鏈接。

在我的機器上它應該是http://localhost/myName/folder(它包含index.php和所有子目錄),在別人的可能是http://localhost/project

如何檢測應用程序根目錄的路徑?

+0

文件在哪裏? – fabrik 2011-03-29 13:28:12

+0

它在/ home/myName/alphp /文件夾中 – auge 2011-03-29 13:31:01

+0

您無法檢測到logout.php的路徑。到你的網站根目錄? – 2011-03-29 13:37:38

回答

1

也許你正在尋找的URL不是路徑

<a href="http://<?php echo $_SERVER['HTTP_HOST']; ?>lib/logout.php">log out</a> 

,你是不是在呼應你的榜樣變量。

+0

這導致http:// <?php echo $ _SERVER ['HTTP_HOST']; ?> lib/logout.php – auge 2011-03-29 13:37:37

+0

@auge:將文件的擴展名從.html改爲.php。 PHP未使用.html文件進行分析 – 2011-03-29 13:38:36

+0

@auge:此代碼在其中執行的文件的擴展名是什麼? – 2011-03-29 13:42:51

1

你的DOCUMENT_ROOT是你的機器本地的 - 所以它最終可能是c:/ www或者其他東西,對REQUIRE或INCLUDE等語句很有用,但對鏈接無用。

如果你有一個可以在網上訪問的頁面 - 鏈接回C:上的文檔將嘗試從本地機器獲取該驅動器。

因此,對於鏈接,您應該能夠通過初始斜槓前往/lib/logout.php,並直接訪問網頁可訪問結構的頂部。

您的網頁,在當地 - 可能是在C:/www/myprojects/project1/lib/logout.php但網站本身可能是在http://www.mydomain.com/lib/project.php

0

框架,如Symfony提供一個複雜的路由機制,它允許你寫鏈接的網址是這樣的:

<a href="<?php echo url_for('lib/logout.php') ?>">log out</a> 

它噸的可能性,這在the tutorial描述。

3

經過OP的一些澄清,它成爲可能回答這個問題。

如果你有被包含在所有的PHP腳本的一些配置文件,放置在應用程序的根文件夾,您可以使用此文件,以確定您的應用程序根目錄:

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 

__FILE__不斷會給你的文件系統中這條道路文件。如果你從它減去DOCUMENT_ROOT,剩下的就是你要找的東西。因此,它可以在你的模板中使用:

<a href="<?php echo $approot?>/lib/logout.php">log out</a> 
+0

OP表示動態確定根。例如,在開發和生產中可能會有所不同。確切地說,是 – 2011-03-29 13:33:03

+0

。它不總是相同的路徑,它取決於調用文件的位置 – auge 2011-03-29 13:36:29

+0

@auge不要稱它爲root然後。如果你想要相對路徑,那麼你必須要求這個。 – 2011-03-29 13:38:48

0

試試這個,

<a href="/lib/logout.php'?>">log out</a> 

這跳轉到直接根源。

0

DOCUMENT_ROOT指的是網絡服務器上的物理路徑。沒有通用的方法來檢測http路徑片段。但是,您經常可以使用PHP_SELFREQUEST_URI

兩者都取決於當前腳本的調用方式。如果當前請求位於/ whatever /目錄中的index.php中,則嘗試使用原始REQUEST_URI字符串。否則它是相當普遍的:

<?= dirname($_SERVER["SCRIPT_NAME"]) . "/lib/logout.php" ?> 

但是,如果您爲此目的使用可配置的常量通常是最好的。這裏有太多的ifs了。

0

我試圖找出PHP的這一點。在asp.net中,我們有Request.ApplicationPath,這很容易。

對於任何人在那裏講流利的PHP誰是試圖幫助,這個代碼是什麼OP的要求,但在asp.net:

public string AppUrl 
{ 
    get 
    { 
     string appUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath; 
     if (appUrl.Substring(appUrl.Length - 1) != "/") 
     { 
      appUrl += "/"; 
     } 
     // Workaround for sockets issue when using VS Built-int web server 
     appUrl = appUrl.Replace("0.0.0.0", "localhost"); 
     return appUrl; 
    } 
} 

我無法弄清楚如何做到這一點PHP,所以我做的是創建一個名爲globals.php的文件,我將其保存在根目錄中。它有以下行:

$appPath = "http://localhost/MyApplication/"; 

它是該項目的一部分,但從源代碼管理中排除。所以各種各樣的開發人員只是將它設置爲任何他們想要的,我們確保永遠不會部署它。這可能是OP試圖跳過的努力(因爲我跳過了我的asp.net代碼)。

我希望這可以幫助您找到答案,或者爲PHP用戶提供解決方法。

相關問題