Подтвердить что ты не робот

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

4b9b3361

Ответ 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.