簡體   English   中英

如何在PHP中設置絕對包含路徑?

[英]How do I set an absolute include path in PHP?

在HTML中,我可以通過以“/”開頭的文件路徑找到從Web服務器的根文件夾開始的文件。 喜歡:

/images/some_image.jpg

我可以將該路徑放在任何子目錄中的任何文件中,它將指向正確的圖像。

使用PHP,我嘗試了類似的東西:

include("/includes/header.php");

......但這不起作用。

我認為這個頁面說我可以設置一次include_path ,之后會假設。 但我不太懂語法。 這兩個例子都以句號開頭,它說:

用一個 。 在include路徑中允許相對包含,因為它表示當前目錄。

相對包含正是我想要的。

如何確保我的所有包含指向root/includes文件夾? (額外獎勵:如果我想將該文件夾放在公共目錄之外怎么辦?)

澄清

我的開發文件目前由XAMPP / Apache提供。 這會影響絕對路徑嗎? (我不確定生產服務器是什么。)

更新

我不知道我的問題在這里。 我上面引用的include_path就是我正在尋找的東西,而且語法並不是真的令人困惑。 我只是嘗試過,效果很好。

我發生的一件事是,有些人可能認為“/ some / path”是“絕對路徑”,因為他們認為操作系統是Linux。 此服務器是Windows,因此絕對路徑必須以驅動器名稱開頭。

無論如何,問題解決了! :)

我所做的是將config.php文件放在我的根目錄中。 我的項目中的所有PHP文件都包含此文件。 在那個config.php文件中,我然后執行以下操作;

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

然后在所有文件中,我知道我的項目的根目錄是什么,可以做這樣的事情

require_once( ROOT_DIR.'/include/functions.php' );

對不起,沒有獲得公共目錄以外的獎勵積分;)這也有一個不幸的副作用,你仍然需要一個相對路徑來查找config.php,但它使你的其他包括更容易。

一個策略

我不知道這是不是最好的方式,但它對我有用。

$root = $_SERVER['DOCUMENT_ROOT'];
include($root."/path/to/file.php");

include_path設置的工作方式類似於unix中的$ PATH(Windows中也有類似的設置)。它包含多個目錄名,由冒號(:)分隔。 當您包含或要求文件時,將按順序搜索這些目錄,直到找到匹配項或搜索所有目錄。

因此,為了確保您的應用程序始終包含您的路徑(如果該文件存在),只需將include目錄放在目錄列表中。

ini_set("include_path", "/your_include_path:".ini_get("include_path"));

這樣,首先搜索include目錄,然后搜索原始搜索路徑(默認為當前目錄,然后是PEAR)。 如果您在修改include_path時沒有問題,那么這就是您的解決方案。

include / require中沒有任何內容禁止您使用絕對路徑。 所以你的榜樣

include('/includes/header.php'); 

應該工作得很好。 假設路徑和文件是corect並且設置了正確的權限。
(從而允許您在文檔根目錄內外包含您喜歡的任何文件)

但是,這種行為被認為是一種可能的安全風險。 因此,系統管理員可以設置open_basedir指令。

此指令配置您可以包含/要求文件的位置,這可能只是您的問題。
某些控制面板(例如plesk)默認情況下將此指令設置為與文檔根相同。

至於'.' 句法:

/home/username/public_html <- absolute path  
public_html <- relative path  
./public_html <- same as the path above  
../username/public_html <- another relative path

但是,我通常使用稍微不同的選項:

require_once(__DIR__ . '/Factories/ViewFactory.php');

在此版本中,您指定相對於包含require_once()語句的文件的絕對路徑。

另一種選擇是在$_SERVER['DOCUMENT_ROOT']目錄中創建一個文件,其中包含絕對路徑的定義。

例如,如果您的$_SERVER['DOCUMENT_ROOT']目錄是

C:\wamp\www\

創建一個包含此文件的文件(即my_paths.php

<?php if(!defined('MY_ABS_PATH')) define('MY_ABS_PATH',$_SERVER['DOCUMENT_ROOT'].'MyProyect/')

現在,您只需要在MyProyect文件夾中的每個文件中包含此文件( my_paths.php ),這樣您就可以將MY_ABS_PATH用作MyProject的絕對路徑。

我在這個上遵循Wordpress的例子。 我去定義一個根路徑,通常是文檔根目錄,然后定義一堆其他路徑(每個我的類目錄一個.IE:數據庫,用戶,HTML等)。 通常我會手動定義根路徑而不是依賴服務器變量。

if($_SERVER['SERVERNAME'] == "localhost")
{
    define("ABS_PATH", "/path/to/upper/most/directory"); // Manual
}
else
{
    define("ABS_PATH, dirname(__FILE__));
    // This defines the path as the directory of the containing file, normally a config.php
}

// define other paths...

include(ABS_PATH."/mystuff.php");

我想出了一行代碼來設置我的每個PHP腳本的頂部以補償:

<?php if(!$root) for($i=count(explode("/",$_SERVER["PHP_SELF"]));$i>2;$i--) $root .= "../"; ?>

通過這個構建$ root to bee“../”從文件所在的任何位置升級到層次結構。 每當我想要包含absolut路徑時,該行將是:

<?php include($root."some/include/directory/file.php"); ?>

我真的不喜歡它,似乎是解決它的一種尷尬的方式,但它似乎可以運行任何系統php運行和文件放置的任何位置,使其獨立於系統。 要訪問web目錄之外的文件,請在$root之后添加更多../ ,例如$root."../external/file.txt"

謝謝 - 如果你谷歌的php apache windows絕對路徑,這是2個鏈接之一。

作為中間PHP開發人員的新手,我不明白為什么apache windopws系統上的絕對路徑將是c:\\ xampp \\ htdocs(apache document root - XAMPP default)而不是/

因此,如果在http // localhost / myapp / subfolder1 / subfolder2 / myfile.php中,我想要包含來自http // localhost / myapp的文件

我需要將其指定為:include(“c:\\ xampp \\ htdocs \\ myapp \\ includeme.php”)或include(“../../ includeme.php”)

並且不包括(“/ myapp / includeme.php”)

不是直接回答你的問題,而是要記住的事情:

在你的ini中使用include with allow_url_include時要注意,當從包含的文件訪問會話時,如果從腳本中使用絕對文件引用包含一個文件,然后使用url文件引用包含來自本地服務器的第二個文件具有不同的變量范圍,並且兩個包含的文件都不會看到相同的會話。 從包含url的文件中將看不到原始會話。

來自: http//us2.php.net/manual/en/function.include.php#84052

嘿所有...我的cms系統有類似的問題。 我需要一些安全方面的艱難道路。 認為最好的方式就像搶寫道。 為了快速編寫臟代碼認為這也有用.. :-)

<?php
$path   = getcwd(); 
$myfile = "/test.inc.php";

/* 

getcwd()指向:/ usr / srv / apache / htdocs / myworkingdir(例如)

echo ($path.$myfile);
would return...

/usr/srv/apache/htdocs/myworkingdir/test.inc.php

access outside your working directory is not allowed.
*/


includ_once ($path.$myfile);

//some code

?>

美好的一天strtok

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM