Как я могу получить «корень приложения» моего URL из PHP? - PullRequest
21 голосов
/ 22 февраля 2010

Если мой 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 я хочу знать, как получить то, что я спрашивал выше.

Ответы [ 6 ]

16 голосов
/ 22 февраля 2010

Когда вы открываете страницу с помощью 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']
12 голосов
/ 22 февраля 2010

Для веб-корня есть DOCUMENT_ROOT, как указано в нескольких ответах. Для корня приложения система не может определить, какая папка в вашем приложении является корневой. Вам придется установить это вручную.

Большинство приложений определяют корень приложения, используя dirname(__FILE__); или параметр конфигурации, и сохраняют его в константе, доступной в приложении.

3 голосов
/ 22 февраля 2010
<?php
define('ABSPATH', dirname(__FILE__));

Поместите следующий код в файл, расположенный в корневой папке вашего приложения, и включайте его при каждой загрузке страницы.

Тогда вы всегда можете просто сделать $path = ABSPATH . '/path/to/file.php'; независимо от того, находится ли ваша локальная копия в подкаталоге folder или нет.


Если в вашем приложении уже есть файл, который включается при каждой загрузке страницы, вы можете просто вставить приведенный выше код в этот файл, и он будет работать.

Просто обратите внимание, что вам может потребоваться добавить дополнительные вызовы dirname() в зависимости от того, где находится этот файл. Добавьте один для каждого каталога, который вы передаете из корня вашего веб-приложения.

Например, если ваше веб-приложение находится в /webapp/, а ваше «глобальное включение» находится в /webapp/includes/framework/init.php, то приведенный выше код необходимо изменить следующим образом:

define('ABSPATH', dirname(dirname(dirname(__FILE__))));

т.е.: 2 дополнительных dirname() вызова из-за двух дополнительных папок из корня веб-приложения (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));
1 голос
/ 22 февраля 2010

$_SERVER['DOCUMENT_ROOT'] укажет вам путь к htdoc, после чего вы сможете перейти оттуда

EDIT

$_SERVER['REQUEST_URI'] всегда будет давать вам /myapp/stuff/to/see из приведенного выше образца URL, независимо от расположения файлов на диске или из какого файла он вызывается.

так что это только вопрос explode ing, array_shift ing и implode ing.

Кстати, из вашей структуры каталогов похоже, что вы используете фреймворк. некоторые фреймворки имеют библиотеку URI / URL, которую вы можете найти полезной (по крайней мере, CodeIgniter имеет, но не уверен на 100% с другими фреймворками)

0 голосов
/ 17 марта 2015

У меня возникла похожая проблема. По сути, в PHP, если файл «A.php» использует относительный путь для ссылки на ресурс, тогда текущее местоположение пути, используемое в качестве префикса для относительного пути, относится к верхнему родительскому php, в который входит «A.php».

Это не будет проблемой, если A.php сам является верхним родителем или когда A.php находится в той же папке, что и его верхний родитель. Но это нарушит импорт.

Лучшее решение, которое я нашел, состояло в том, чтобы сделать ссылку явно абсолютной, используя DIR (которая дает текущее местоположение файла), а затем перейдя по ссылке из этого местоположения, например, для. DIR . "/../ help.php" для ссылки на файл help.php, расположенный на 1 уровень выше A.php.

0 голосов
/ 22 февраля 2010

Попробуйте это:

 echo dirname(__FILE__);

где __FILE__ - имя текущего исполняемого скрипта, а dirname извлекает из него папку / папку приложения.

Дополнительные параметры:

echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir

На PHP.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...