Как я могу получить "корень приложения" моего URL-адреса от PHP?
Если мой URL http://www.server.com/myapp/stuff/to/see
, а моя структура каталогов на диске htdocs/myapp/*
, как я могу извлечь часть /myapp
? Кроме того, что, если не было папки приложения, а корнем приложения был только "/"? Есть ли предопределенная переменная для получения этого значения?
То, что я хочу, это функция, которая может обрезать /myapp
с URI запроса, так что я остался только с /stuff/to/see
. И, если бы я должен был перенести приложение в корневой каталог сервера, определите его также (чтобы /stuff/to/see
был просто возвращен как /stuff/to/see
)
Моя структура каталогов такова:
application
|-config
|-config.inc.php
library
|-autoload.class.php
public
|-css
|-img
index.php
Итак, из index.php, я хочу знать, как получить то, что я спросил выше.
Ответы
Ответ 1
Для веб-корня существует DOCUMENT_ROOT
, как указано в нескольких ответах. Для корня приложения нет способа определить, какая папка в вашем приложении является корневой папкой. Вам нужно будет установить это вручную.
Большинство приложений определяют корень приложения с помощью dirname(__FILE__);
или настройки конфигурации и сохраняют его в константе, доступной во всем приложении.
Ответ 2
При доступе к странице с помощью http://www.server.com/myapp/stuff/to/see
, а ваш корневой каталог вашего веб-сервера находится в /something/htdocs/
, тогда текущий путь local
равен /something/htdocs/myapp/stuff/to/see
.
В настоящее время нет определенного решения для получения /something/htdocs/myapp/
, потому что нет четкого определения того пути, который вы должны получить. Когда у вас есть какое-то правило для этого, скажите нам, и мы сможем что-то придумать, но без вычислений, единственные пути, которые вы можете увидеть:
-
http://www.server.com/myapp/stuff/to/see
$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
-
/something/htdocs/myapp/stuff/to/see/index.php
$_SERVER['SCRIPT_FILENAME']
-
/something/htdocs/
$_SERVER['DOCUMENT_ROOT']
-
/myapp/stuff/to/see
$_SERVER['REQUEST_URI']
-
/myapp/stuff/to/see/index.php
$_SERVER['SCRIPT_NAME']
и $_SERVER['PHP_SELF']
Ответ 3
<?php
define('ABSPATH', dirname(__FILE__));
Поместите следующий код в файл, расположенный в корневой папке приложения, и включите его при каждой загрузке страницы.
Затем вы всегда можете просто $path = ABSPATH . '/path/to/file.php';
независимо от того, находится ли ваша локальная копия в подкаталоге folder
или нет.
Если у вашего приложения уже есть файл, который включен в каждую загрузку на страницу, вы можете просто удалить указанный выше код в этом файле, и он будет работать.
Обратите внимание, что вам может потребоваться добавить дополнительные вызовы dirname()
в зависимости от того, где находится этот файл. Добавьте один для каждого каталога, который вы передаете из корня вашего веб-приложения.
Например, если ваш webapp находится в /webapp/
, а ваш "global include" находится в /webapp/includes/framework/init.php
, тогда указанный выше код должен быть изменен как таковой:
define('ABSPATH', dirname(dirname(dirname(__FILE__))));
то есть.: 2 дополнительных вызова dirname()
из-за двух дополнительных папок из корня webapp (includes/framework
)
Разъяснение
Приведенный выше код предназначен для одного файла и одного файла только в вашем веб-приложении. Этот файл должен быть включен для каждой загрузки страницы.
Если у вас уже есть файл, который включен перед любой обработкой (например, файл конфигурации или другой), вы можете скопировать и вставить этот код в этот файл.
Количество вызовов dirname()
зависит от того, насколько глубоко вы скопировали файл и вставили
код находится относительно корневого каталога вашего веб-приложения. Для приведенных выше примеров предположим, что корень вашего веб-приложения представлен ~
.
Если вы скопируете мой код в ~/abspath.php
, вам понадобится один вызов dirname()
.
Если вы скопируете мой код в ~/includes/abspath.php
, вам понадобятся два вызова dirname()
.
Если вы скопируете мой код в ~/includes/config/abspath.php
, вам понадобятся три вызова dirname()
. Теперь позвольте сказать, что его окончательное местоположение.
В ~/index.php
вы выполните следующее:
<?php
require_once('includes/config/abspath.php');
и у вас есть доступ к ABSPATH
.
В ~/dir/someOtherPage.php
вы выполните следующее:
<?php
require_once('../includes/config/abspath.php');
и у вас есть доступ к ABSPATH
.
Вот почему я говорю, что если у вас уже есть файл, который включен в каждую загрузку страницы, его проще просто отбросить в нем вышеуказанный код. Просто убедитесь, что вы соответствующим образом изменяете количество вызовов dirname()
. Опять же, этот код предназначен для ТОЛЬКО ОДНОГО ФАЙЛА.
Затем получите URL-путь, это просто вопрос удаления DOCUMENT_ROOT
FROM ABSPATH
:
$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
define('RELADDR', substr(ABSPATH, strlen($docRoot));
Ответ 4
$_SERVER['DOCUMENT_ROOT']
предоставит вам путь к htdocs, затем вы можете перейти оттуда
ИЗМЕНИТЬ
$_SERVER['REQUEST_URI']
всегда будет давать вам /myapp/stuff/to/see
с вашего образца URL выше, независимо от расположения файлов на диске или из какого файла он вызывается.
так что это всего лишь вопрос explode
ing, array_shift
ing и implode
ing.
btw, из вашей структуры каталогов, похоже, что вы используете фреймворк. некоторые структуры имеют библиотеку URI/URL, которую вы можете найти полезной (по крайней мере, CodeIgniter имеет не 100% уверенность в других фреймворках)
Ответ 5
Попробуйте следующее:
echo dirname(__FILE__);
где __FILE__
- это имя текущего исполняемого файла script, а dirname
выводит из него папку/приложение.
Дополнительные параметры:
echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir
На PHP.net
Ответ 6
У меня возникла аналогичная проблема. В принципе, в PHP, если файл "A.php" использует относительный путь для ссылки на ресурс, то текущее местоположение пути, используемое в качестве префикса относительного пути, относится к первому родительскому php, под которым включен "A.php".
Это не будет проблемой, если сам A.php является главным родителем или когда A.php находится в той же папке, что и ее верхний родитель. Но в противном случае он нарушит импорт.
Лучшее решение, которое я нашел, - сделать ссылку явно абсолютной, используя DIR (которая дает текущее местоположение файла), а затем переходит к указанному из этого местоположения, например. DIR. "/../help.php" для ссылки на файл help.php, сидящий на 1 уровень выше A.php.