[英]How can I set an absolute path for include function in php above the working directory?
[英]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.