Ну, структура сайта проста:
config
папка
login
папка
config.php:
include_once '../config/cesar.php';
В site.com/index.php
:
Warning: include_once(../config/cesar.php): failed to open stream: No such file or directory
В site.com/login/index.php
все отлично.
Если я удалю одну точку (./config/cesar.php), основной индекс станет ОК и страница входа получит ошибку.
Как заставить оба кода работать?
..
в вашем пути используются для перехода в каталог, потому что файл не будет существовать там, где вы его ищете.
Если вы обновите его, чтобы быть include_once 'config/cesar.php';
это должно работать, поскольку это позволит ему перейти в каталог config, а не пытаться найти каталог с именем config 1 уровня выше, где находится index.php.
./
работает с .
это обозначение для текущего каталога.
Чтобы ответить на ваш вопрос, было бы невозможно заставить код работать с использованием относительного пути, поскольку оба файла находятся в разных местах на сервере относительно того, который вы хотите включить. Если вы хотите что-то сделать, вам нужно будет использовать абсолютный путь, а не относительный путь. Это было бы что-то вроде /path/to/webdirectory/site.com/path/to/file/config.php
(Т.е. /home/charles/websites/site.com/config/config.php
) в * nix и C:\path\to\webdirectory\site.com\path\to\file\config.php
на окнах.
В PHP вы сможете динамически получить абсолютный путь, используя $_SERVER['DOCUMENT_ROOT']
переменная. Пример: include_once $_SERVER['DOCUMENT_ROOT'] . '/config/cesar.php';
Warning: include_once(../config/cesar.php): failed to open stream: No such file or directory
Однажды я столкнулся с подобной проблемой. Вы должны помнить, что (./config/xxx.php)
а также (config/xxx.php)
означает то же самое, но (../config/xxx.php)
зайдет в каталог и найдет в нем папку config и файл xxx.php.
Вы также можете использовать $base_url
в качестве строки перед всеми вашими путями, чтобы сделать ее чистой. Куда:
$base_url = 'http://' . $_SERVER['SERVER_NAME'];
Затем замените ваши пути, как
../config/xxx.php
с
$base_url.'/config/xxx.php'