Вернуть текущий веб-путь в PHP - PullRequest
2 голосов
/ 11 марта 2010

В настоящее время разрабатываю фреймворк PHP и столкнулся с моей первой проблемой. Мне нужно иметь возможность поместить фреймворк в любую папку на сервере, независимо от того, сколько папок в глубине, и мне нужно найти этот каталог для использования в качестве базового URL.

Например, в настоящее время это работает, если я помещаю фреймворк в корень сервера (http://cms.dev/),, но если бы я поместил его в http://cms.dev/folder/, он не работает.

Ответы [ 10 ]

4 голосов
/ 11 марта 2010

Существует четыре существующих ответа, но все они, похоже, имеют дело с путями к файлам, а вы спрашиваете о базовом URL для веб-запросов.

При любом веб-запросе вы получаете кучу ключей в $_SERVER, которые могут оказаться полезными. Например, в вашем фиктивном примере у вас может быть следующее:

Думая критически, как бы вы извлекли базовый URL для любого данного подзапроса? В некоторых случаях вы можете посмотреть на $_SERVER['REQUEST_URI'] и убрать конечные элементы, если знаете, насколько глубоко в вашей иерархии находится запрос. (Например, если ваш скрипт имеет глубину в две папки, удалите последние два элемента пути.) Когда используются PATH_INFO или mod_rewrite, все становится менее понятным: по мере того, как предоставляются более длинные и длинные URL-адреса, нет четких указание, где заканчиваются пути и начинается динамический URL.

Вот почему WordPress, MediaWiki, phpBB, phpMyAdmin и все написанные мною приложения заставляют пользователя вручную указывать базовый URL как часть конфигурации приложения.

4 голосов
/ 11 марта 2010

__FILE__ - магическая константа, которая возвращает весь путь текущего скрипта. Объедините с dirname и добавьте ".." соответственно. Он более надежен, чем getcwd, поскольку не может измениться во время выполнения.

Затем вы можете удалить корень сети, чтобы получить относительный путь к вашему сценарию (должен отображаться на URL). Есть много $_SERVER переменных, которые имеют эту информацию. Я предлагаю использовать файловую систему для определения:

  1. Если ваш сценарий общедоступен?
  2. На какой глубине / префиксе URL?

Затем объедините с вашим базовым URL. Если путь вашего скрипта == /home/public/foo_1/script.php ... и ваш $ _SERVER ['DOCUMENT_ROOT'] == /home/public

Затем вы можете переписать ваш URL как /foo_1/script.php. Вам не нужен полный URL, если вы этого не хотите. Этот метод работает лучше всего, если вы выполняете его из центрального расположения, например, автозагрузчик.

2 голосов
/ 11 марта 2010

Чтобы заставить URL работать, проверьте базовый тег :

<base href="http://cms.dev/folder/" />

Если проблема заключается в путях к файлам PHP, следуйте советам Pestilance:

dirname(__FILE__) // returns the directory of current file
1 голос
/ 11 марта 2010

В массиве $_SERVER есть куча полезных вещей, доступных для подобных вещей. Сделайте var_dump($_SERVER);, чтобы увидеть, какие элементы массива вам нужны.

0 голосов
/ 20 мая 2019

То, что вы ищете, это WEBROOT вашего приложения на основе вашего описания. Проверенный ответ, безусловно, самый близкий ответ.

Самый простой способ идентифицировать webroot - это определить его пользователем, как было упомянуто Annika и отмечено в комментарии.

Однако, есть некоторая информация, которая была упущена:

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

$web_only_path = dirname($_SERVER['PHP_SELF']); 

Это будет работать, только если ваши условия перезаписи выполнены правильно.

Если они находятся в файле htaccess , не волнуйтесь.

Однако, если они находятся в файле Apache Conf. Затем они должны содержаться в контейнере, чтобы переменная SERVER сохраняла и возвращала правильную информацию после работы через перенаправления при работе с дружественными для SEO URL-адресами.

См .: SCRIPT_NAME и PHP_SELF с mod_rewrite в .conf

0 голосов
/ 09 октября 2012
function GetCurrentWebDir() {
    $CurrentPath = substr(
        $_SERVER['SCRIPT_URL'], 0,
        strlen($_SERVER['SCRIPT_URL']) - strlen(
            strrchr($_SERVER['SCRIPT_URL'], "\\")
        )
    );

    $CurrentFileName = basename(__FILE__);

    return substr_replace(
        $CurrentPath, '', -strlen($CurrentFileName),
        strlen($CurrentFileName)
    );
} 

echo 'current dir:'.GetCurrentWebDir();`

cp:/apps/PHP/testtesttesttesttesttesttesttesttesttesttest.php
fn:testtesttesttesttesttesttesttesttesttesttest.php
len:48
current dir:/apps/PHP/ 
0 голосов
/ 11 марта 2010
dirname(__FILE__);
basename(__FILE__);
print_r($_SERVER);
pathinfo('www/htdocs/index.html');
realpath('../../dir1/');
parse_url('http://username:password@hostname/path?arg=value#anchor');
0 голосов
/ 11 марта 2010

Похоже, вы ищете относительный путь.

$_SERVER['SCRIPT_FILENAME']

должен сделать свое дело. Сайт php.net имеет хорошую документацию о том, что доступно для этого http://php.net/manual/en/reserved.variables.server.php

Кроме того, если вам когда-нибудь интересно узнать, что там еще есть и какие значения

<?php print_r($_SERVER);  ?>  

расскажет вам больше, чем вы думали, что можете знать.

0 голосов
/ 11 марта 2010

Чтобы получить текущий путь к файлу, вы должны использовать:

$path=getcwd();

Это вернет вас, если в Windows, например, C:\blah\blah\blah без имени файла.

0 голосов
/ 11 марта 2010

Используйте dirname(__PATH__) для извлечения пути к родительскому каталогу.

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