我有一个正在开发的网站,我正在尝试访问该网站的主目录,但我不知道如何设置它。我想要做的是包含_inc/config.php
通过/_inc/config.php
而不是必须使用../_inc/config.php
任何想法如何添加它?
3 回答
一般来说,在处理路径时有两个不同的问题需要解决:
- 文件系统路径(您需要用于
include
文件) - URL 路径(在构建应用程序内部的 URL 时需要使用)
这是两种不同的野兽。
文件系统路径
如果您的应用程序有一个单一的入口点(例如index.php
,在检查 URL 查询字符串后委托给适当的业务逻辑),那么您可以这样做
$ROOT_DIR = dirname(__FILE__);
在该文件中,然后您可以通过附加到$ROOT_DIR
.
如果您的应用程序没有单一入口点,则此选项不可用,您可以使用以下选项:
- 在任何地方都使用相对路径(这是您想要避免的)。
从当前入口脚本调用“路径解析”函数,将脚本的相对路径作为参数传递到基目录,例如:
// for a script in $ROOT_DIR.'/commands' do this:
$ROOT_DIR = resolve_root(__FILE__, DIRECTORY_SEPARATOR.'commands');
附加的相对路径信息将能够确定应用程序根的
resolve_root($filename, $relative)
哪一部分。dirname($filename)
但是,该技术很笨拙,并且需要您在每个应用程序入口点内硬编码相对路径名,因此我建议您不要使用它。要求您的应用程序配置包含带有“根”路径的硬编码变量,类似于
$ROOT_DIR
上面。如果您的应用程序有安装程序,那么在安装过程中,您可以通过执行以下操作让它准确地解析根路径:
$installer_dir = dirname(__FILE__); // assume this is root path + "/install"
$ROOT_DIR = realpath($installer_dir.DIRECTORY_SEPARATOR.'..');
然后安装程序会将此路径写入您的应用程序配置。如果您的应用程序没有安装程序,那么您需要手动硬编码配置的基本路径或使用其他选项。
对于这个问题,使用$_SERVER['DOCUMENT_ROOT']
并不是一个令人满意的解决方案。只有当您的应用程序安装在文档根目录时,它才能完成这项工作。如果您的文档根目录是/var/www
并且您的应用程序安装在 中/var/www/app
,那么您无法知道应该添加/app
到路径中。
更新:
关于提到pwd
在 Linux 上运行的答案:请不要那样做。曾经。为每个 HTTP 请求调用系统 shell 会比用户单击链接的速度更快地杀死您的 Web 服务器。它可以适用于具有少量用户且对性能没有真正期望的内部应用程序,但如果您对快速而肮脏的解决方案感到满意,为什么不简单地对该路径进行硬编码呢?
网址路径
在任何实际应用程序中,您还需要创建相对于应用程序基本 URL 的 URL(例如,to do <img src="$BASE_URL/images/icon.png" />
)。
同样,如果您的应用程序只有一个入口点(例如index.php
),那么您可以使用它$_SERVER['REQUEST_URI']
来解析应用程序的“基本”URL。一个简单的实现(对您来说应该可以正常工作)很简单:它是 URL 路径的一部分,位于index.php
. 但是,针对不同 Web 服务器和 PHP 配置的怪癖而工作的防弹实现有点复杂。
如果您的应用程序没有单个入口点,那么您将遇到与文件系统路径相同的问题。解决方案也是相同的:要么手动硬编码配置中的 URL,在安装期间让安装程序硬编码它,要么根据需要使用相对路径的硬编码知识来解决它。
我使用绝对路径,但我也使用引导文件启动任何自定义 PHP 项目,在该文件中,我将最常用的路径定义为常量,基于从$_SERVER
.
这就是我定义根路径的方式:
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT", isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : (isset($_SERVER["SERVER_NAME"]) ? $_SERVER["SERVER_NAME"] : '_UNKNOWN_'));
路径LOCAL_PATH_ROOT
是文档根目录。HTTP_PATH_ROOT
通过 HTTP 访问同一路径时,该路径是等效的。
此时,可以使用以下代码将任何本地路径转换为 HTTP 路径:
str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, $my_path)
如果您想确保与基于 Windows 的服务器的兼容性,您还需要将目录分隔符替换为 URL 分隔符:
str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, str_replace(DIRECTORY_SEPARATOR, '/', $my_path))
这是我用于PHP PowerTools 样板的完整引导代码:
defined('LOCAL_PATH_BOOTSTRAP') || define("LOCAL_PATH_BOOTSTRAP", __DIR__);
// -----------------------------------------------------------------------
// DEFINE SEPERATOR ALIASES
// -----------------------------------------------------------------------
define("URL_SEPARATOR", '/');
define("DS", DIRECTORY_SEPARATOR);
define("PS", PATH_SEPARATOR);
define("US", URL_SEPARATOR);
// -----------------------------------------------------------------------
// DEFINE ROOT PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_ROOT", '');
define("LOCAL_PATH_ROOT", $_SERVER["DOCUMENT_ROOT"]);
define("HTTP_PATH_ROOT",
isset($_SERVER["HTTP_HOST"]) ?
$_SERVER["HTTP_HOST"] : (
isset($_SERVER["SERVER_NAME"]) ?
$_SERVER["SERVER_NAME"] : '_UNKNOWN_'));
// -----------------------------------------------------------------------
// DEFINE RELATIVE PATHS
// -----------------------------------------------------------------------
define("RELATIVE_PATH_BASE",
str_replace(LOCAL_PATH_ROOT, RELATIVE_PATH_ROOT, getcwd()));
define("RELATIVE_PATH_APP", dirname(RELATIVE_PATH_BASE));
define("RELATIVE_PATH_LIBRARY", RELATIVE_PATH_APP . DS . 'vendor');
define("RELATIVE_PATH_HELPERS", RELATIVE_PATH_BASE);
define("RELATIVE_PATH_TEMPLATE", RELATIVE_PATH_BASE . DS . 'templates');
define("RELATIVE_PATH_CONFIG", RELATIVE_PATH_BASE . DS . 'config');
define("RELATIVE_PATH_PAGES", RELATIVE_PATH_BASE . DS . 'pages');
define("RELATIVE_PATH_ASSET", RELATIVE_PATH_BASE . DS . 'assets');
define("RELATIVE_PATH_ASSET_IMG", RELATIVE_PATH_ASSET . DS . 'img');
define("RELATIVE_PATH_ASSET_CSS", RELATIVE_PATH_ASSET . DS . 'css');
define("RELATIVE_PATH_ASSET_JS", RELATIVE_PATH_ASSET . DS . 'js');
// -----------------------------------------------------------------------
// DEFINE LOCAL PATHS
// -----------------------------------------------------------------------
define("LOCAL_PATH_BASE", LOCAL_PATH_ROOT . RELATIVE_PATH_BASE);
define("LOCAL_PATH_APP", LOCAL_PATH_ROOT . RELATIVE_PATH_APP);
define("LOCAL_PATH_LIBRARY", LOCAL_PATH_ROOT . RELATIVE_PATH_LIBRARY);
define("LOCAL_PATH_HELPERS", LOCAL_PATH_ROOT . RELATIVE_PATH_HELPERS);
define("LOCAL_PATH_TEMPLATE", LOCAL_PATH_ROOT . RELATIVE_PATH_TEMPLATE);
define("LOCAL_PATH_CONFIG", LOCAL_PATH_ROOT . RELATIVE_PATH_CONFIG);
define("LOCAL_PATH_PAGES", LOCAL_PATH_ROOT . RELATIVE_PATH_PAGES);
define("LOCAL_PATH_ASSET", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET);
define("LOCAL_PATH_ASSET_IMG", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
define("LOCAL_PATH_ASSET_CSS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
define("LOCAL_PATH_ASSET_JS", LOCAL_PATH_ROOT . RELATIVE_PATH_ASSET_JS);
// -----------------------------------------------------------------------
// DEFINE URL PATHS
// -----------------------------------------------------------------------
if (US === DS) { // needed for compatibility with windows
define("HTTP_PATH_BASE", HTTP_PATH_ROOT . RELATIVE_PATH_BASE);
define("HTTP_PATH_APP", HTTP_PATH_ROOT . RELATIVE_PATH_APP);
define("HTTP_PATH_LIBRARY", false);
define("HTTP_PATH_HELPERS", false);
define("HTTP_PATH_TEMPLATE", false);
define("HTTP_PATH_CONFIG", false);
define("HTTP_PATH_PAGES", false);
define("HTTP_PATH_ASSET", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET);
define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_IMG);
define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_CSS);
define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT . RELATIVE_PATH_ASSET_JS);
} else {
define("HTTP_PATH_BASE", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_BASE));
define("HTTP_PATH_APP", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_APP));
define("HTTP_PATH_LIBRARY", false);
define("HTTP_PATH_HELPERS", false);
define("HTTP_PATH_TEMPLATE", false);
define("HTTP_PATH_CONFIG", false);
define("HTTP_PATH_PAGES", false);
define("HTTP_PATH_ASSET", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_ASSET));
define("HTTP_PATH_ASSET_IMG", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_ASSET_IMG));
define("HTTP_PATH_ASSET_CSS", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_ASSET_CSS));
define("HTTP_PATH_ASSET_JS", HTTP_PATH_ROOT .
str_replace(DS, US, RELATIVE_PATH_ASSET_JS));
}
// -----------------------------------------------------------------------
// DEFINE REQUEST PARAMETERS
// -----------------------------------------------------------------------
define("REQUEST_QUERY",
isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"] != '' ?
$_SERVER["QUERY_STRING"] : false);
define("REQUEST_METHOD",
isset($_SERVER["REQUEST_METHOD"]) ?
strtoupper($_SERVER["REQUEST_METHOD"]) : false);
define("REQUEST_STATUS",
isset($_SERVER["REDIRECT_STATUS"]) ?
$_SERVER["REDIRECT_STATUS"] : false);
define("REQUEST_PROTOCOL",
isset($_SERVER["HTTP_ORIGIN"]) ?
substr($_SERVER["HTTP_ORIGIN"], 0,
strpos($_SERVER["HTTP_ORIGIN"], '://') + 3) : 'http://');
define("REQUEST_PATH",
isset($_SERVER["REQUEST_URI"]) ?
str_replace(RELATIVE_PATH_BASE, '',
$_SERVER["REQUEST_URI"]) : '_UNKNOWN_');
define("REQUEST_PATH_STRIP_QUERY",
REQUEST_QUERY ?
str_replace('?' . REQUEST_QUERY, '', REQUEST_PATH) : REQUEST_PATH);
// -----------------------------------------------------------------------
// DEFINE SITE PARAMETERS
// -----------------------------------------------------------------------
define("PRODUCTION", false);
define("PAGE_PATH_DEFAULT", US . 'index');
define("PAGE_PATH",
(REQUEST_PATH_STRIP_QUERY === US) ?
PAGE_PATH_DEFAULT : REQUEST_PATH_STRIP_QUERY);
如果您将上面的代码添加到您自己的项目中,此时输出所有用户常量(可以使用get_defined_constants(true)
的结果应该看起来像这样:
array (
'LOCAL_PATH_BOOTSTRAP' => '/var/www/libraries/backend/Data/examples',
'URL_SEPARATOR' => '/',
'DS' => '/',
'PS' => ':',
'US' => '/',
'RELATIVE_PATH_ROOT' => '',
'LOCAL_PATH_ROOT' => '/var/www',
'HTTP_PATH_ROOT' => 'localhost:8888',
'RELATIVE_PATH_BASE' => '/libraries/backend/Data/examples',
'RELATIVE_PATH_APP' => '/libraries/backend/Data',
'RELATIVE_PATH_LIBRARY' => '/libraries/backend/Data/vendor',
'RELATIVE_PATH_HELPERS' => '/libraries/backend/Data/examples',
'RELATIVE_PATH_TEMPLATE' => '/libraries/backend/Data/examples/templates',
'RELATIVE_PATH_CONFIG' => '/libraries/backend/Data/examples/config',
'RELATIVE_PATH_PAGES' => '/libraries/backend/Data/examples/pages',
'RELATIVE_PATH_ASSET' => '/libraries/backend/Data/examples/assets',
'RELATIVE_PATH_ASSET_IMG' => '/libraries/backend/Data/examples/assets/img',
'RELATIVE_PATH_ASSET_CSS' => '/libraries/backend/Data/examples/assets/css',
'RELATIVE_PATH_ASSET_JS' => '/libraries/backend/Data/examples/assets/js',
'LOCAL_PATH_BASE' => '/var/www/libraries/backend/Data/examples',
'LOCAL_PATH_APP' => '/var/www/libraries/backend/Data',
'LOCAL_PATH_LIBRARY' => '/var/www/libraries/backend/Data/vendor',
'LOCAL_PATH_HELPERS' => '/var/www/libraries/backend/Data/examples',
'LOCAL_PATH_TEMPLATE' => '/var/www/libraries/backend/Data/examples/templates',
'LOCAL_PATH_CONFIG' => '/var/www/libraries/backend/Data/examples/config',
'LOCAL_PATH_PAGES' => '/var/www/libraries/backend/Data/examples/pages',
'LOCAL_PATH_ASSET' => '/var/www/libraries/backend/Data/examples/assets',
'LOCAL_PATH_ASSET_IMG' => '/var/www/libraries/backend/Data/examples/assets/img',
'LOCAL_PATH_ASSET_CSS' => '/var/www/libraries/backend/Data/examples/assets/css',
'LOCAL_PATH_ASSET_JS' => '/var/www/libraries/backend/Data/examples/assets/js',
'HTTP_PATH_BASE' => 'localhost:8888/libraries/backend/Data/examples',
'HTTP_PATH_APP' => 'localhost:8888/libraries/backend/Data',
'HTTP_PATH_LIBRARY' => false,
'HTTP_PATH_HELPERS' => false,
'HTTP_PATH_TEMPLATE' => false,
'HTTP_PATH_CONFIG' => false,
'HTTP_PATH_PAGES' => false,
'HTTP_PATH_ASSET' => 'localhost:8888/libraries/backend/Data/examples/assets',
'HTTP_PATH_ASSET_IMG' => 'localhost:8888/libraries/backend/Data/examples/assets/img',
'HTTP_PATH_ASSET_CSS' => 'localhost:8888/libraries/backend/Data/examples/assets/css',
'HTTP_PATH_ASSET_JS' => 'localhost:8888/libraries/backend/Data/examples/assets/js',
'REQUEST_QUERY' => false,
'REQUEST_METHOD' => 'GET',
'REQUEST_STATUS' => false,
'REQUEST_PROTOCOL' => 'http://',
'REQUEST_PATH' => '/',
'REQUEST_PATH_STRIP_QUERY' => '/',
'PRODUCTION' => false,
'PAGE_PATH_DEFAULT' => '/index',
'PAGE_PATH' => '/index',
)
包括通过文件系统或 http 进行的工作。
如果您使用 include /some/file.php PHP 在服务器根目录中查找。
您可以使用
include $_SERVER['DOCUMENT_ROOT'] . '/some/file.php';
或者可能在 php.ini(或.htaccess)中更改 open_basedir。即 open_basedir=/some/where/ 从那个根目录使用 /file.php 而不是服务器的根目录或文档根目录。还要检查 php.ini 中的“路径和目录”部分