Относительный путь или абсолютный путь и как настроить в PHP
У меня есть сайт, над которым я работаю, и я пытаюсь перейти в главный каталог сайта, и я не знаю, как это настроить. Что я пытаюсь сделать, это включить _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-запроса убьет ваш веб-сервер быстрее, чем ваши пользователи смогут нажать на ваши ссылки. Он может работать для внутреннего приложения с известным небольшим количеством пользователей и без реальных ожиданий производительности, но почему бы просто не жестко закодировать этот путь, если у вас все в порядке с быстрым и грязным решением?
URL-пути
Внутри любого реального приложения вам также необходимо создать URL-адреса относительно базового URL-адреса вашего приложения (например, чтобы сделать <img src="$BASE_URL/images/icon.png" />
).
Опять же, если ваше приложение имеет одну точку входа (например, index.php
) тогда вы можете использовать $_SERVER['REQUEST_URI']
разрешить "базовый" URL вашего приложения. Простая реализация (которая должна хорошо работать для вас) проста: это часть пути URL, которая предшествует index.php
, Однако пуленепробиваемая реализация, которая работает вокруг причуд различных веб-серверов и конфигураций 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';
или, возможно, измените open_basedir в php.ini (или.htaccess). то есть open_basedir=/some/where/ использовать /file.php из корневого каталога THAT вместо корневого каталога сервера или корня документа. Также проверьте раздел "пути и каталоги" в php.ini