2008-10-06 2 views
10

Я хотел бы найти базовый url моего приложения, поэтому я могу автоматически ссылаться на другие файлы в моем дереве приложений ...Как я могу найти базовый url приложения?

Так что задан файл config.php в базе моего приложения, если файл в подкаталог включает его, знает, что префикс url с.

application/config.php 
application/admin/something.php 
application/css/style.css 

Поэтому, учитывая, что http://www.example.com/application/admin/something.php доступ, я хочу, чтобы иметь возможность знать, что файл CSS в $approot/css/style.css. В этом случае $approot - «/application», но я хотел бы узнать, установлено ли приложение в другом месте.

Я не уверен, что это возможно, многие приложения (phpMyAdmin, Squirrelmail, я думаю) должны установить конфигурационную переменную для начала. Это было бы более удобно, если бы он просто знал.

ответ

15

Я использую следующее в рамках доморощенного ... Поместите это в файл в корневую папку вашего приложения и просто включите его.

define('ABSPATH', str_replace('\\', '/', dirname(__FILE__)) . '/'); 

$tempPath1 = explode('/', str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME']))); 
$tempPath2 = explode('/', substr(ABSPATH, 0, -1)); 
$tempPath3 = explode('/', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))); 

for ($i = count($tempPath2); $i < count($tempPath1); $i++) 
    array_pop ($tempPath3); 

$urladdr = $_SERVER['HTTP_HOST'] . implode('/', $tempPath3); 

if ($urladdr{strlen($urladdr) - 1}== '/') 
    define('URLADDR', 'http://' . $urladdr); 
else 
    define('URLADDR', 'http://' . $urladdr . '/'); 

unset($tempPath1, $tempPath2, $tempPath3, $urladdr); 

Приведенный выше код определяет две константы. ABSPATH содержит абсолютный путь к корню приложения (локальная файловая система), в то время как URLADDR содержит полный URL-адрес приложения. Он работает в ситуациях mod_rewrite.

1

Если вы не отследите это самостоятельно, я не верю, что это будет определение. Вернее, вы просите PHP отслеживать то, что вы произвольно определяете.

Долгий и короткий, если я правильно понимаю ваш вопрос, я не верю, что то, о чем вы просите, существует, по крайней мере, не как «основной» PHP; данная структура может предоставить «корневой» URL-адрес относительно структуры каталогов, которую это понимает.

Это имеет смысл?

2

REQUEST_URI в сочетании с dirname() может сказать вам ваш текущий каталог, относящиеся к URL пути:

<?php 
    echo dirname($_SERVER["REQUEST_URI"]); 
?> 

Так http://example.com/test/test.php печатает «/ тест» или http://example.com/ печатает «/», который можно использовать для создания ссылок на обратитесь к другим страницам относительно текущего пути.

EDIT: только что понятый при повторном чтении, что вы можете спрашивать о пути на диске в отличие от пути URL. В этом случае, вы хотите getcwd() функцию РНР вместо:

<?php 
    echo getcwd(); 
?> 
1

это в вашем config.php (который находится в корневой директории вашего приложения):

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 

Я думаю, что сделаю это.

+0

Это близко, но не совсем. Я думаю, что это перепуталось из-за сглаживания сервера. – DGM 2008-10-07 00:34:34

+0

+1 для интересной математики. :) – DGM 2008-10-07 00:40:12

+0

А, это правда. Я думаю, зависит ли это от конфигурации вашего сервера. – 2008-10-07 13:28:30

0

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

../css/style.css 
+2

Проблема в том, что это шаблон, но потенциально вызванный с разных уровней, поэтому мне нужно знать, какой уровень вызывать на основе сценария, или мне нужен полный url – DGM 2008-10-07 00:36:30

0

Если вы хотите, чтобы путь в файловой системе вы можете использовать $_SERVER['DOCUMENT_ROOT']
Если вы просто хотите, чтобы путь к файлу, который появляется в URL после использование домена $_SERVER['REQUEST_URI']

0

Я никогда не нашел способ сделать это так.

Я всегда устанавливаю конфигурационную переменную с контуром сервера на один уровень выше веб-корня.Затем это:

  • $ configVar. 'public/whatever /' для материала внутри root,
  • , но вы также можете включить извне с помощью $ configVar. 'PhpInc/db.inc.php /' и т.д.
0

Это работает как шарм для меня, где бы я разворачивать, с или без правил перезаписи:

$ BASEDIR = 'HTTP: //'. $ _SERVER ['HTTP_HOST']. (Dirname ($ _ SERVER ['SCRIPT_NAME'])! = '/'? Dirname ($ _ SERVER ["SCRIPT_NAME"]). '/': '/');

+1

. Это близко, но он не брит выключения подкаталогов приложения из URL-адреса. Поэтому, если я нахожусь в http: //hostname/application/subfolder/test.php и включая файл в/application, который определяет эту переменную, у него все еще есть подпапка в url.Я хочу только/приложение – DGM 2009-03-20 16:24:33

1

URL корень приложения можно найти

$protocol = (strstr('https',$_SERVER['SERVER_PROTOCOL']) === false)?'http':'https'; 
$url = $protocol.'://'.$_SERVER['SERVER_NAME'].dirname($_SERVER['REQUEST_URI']); 

этот код будет возвращать путь URL-адрес любого приложения ли быть в сети или на автономном сервере.

Я не сделал надлежащей проверки правильности '/'. Пожалуйста, измените его для косой черты.

Этот файл должен быть помещен в корень.

пример: если приложение URL:

http://localhost/test/test/test.php 

, этот код будет возвращать

http://localhost/test/test 

Благодарности

5

Вы можете найти базовый URL с ниже код:

define('SITE_BASE_PATH','http://'.preg_replace('/[^a-zA-Z0-9]/i','',$_SERVER['HTTP_HOST']).'/'.str_replace('\\','/',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/'); 

Короткие и лучшие.

0

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

define('DOC_URL', ($_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['SERVER_NAME'].(!in_array($_SERVER['SERVER_PORT'], array(80,443))?':'.$_SERVER['SERVER_PORT']:'')).dirname($_SERVER['REQUEST_URI']); 

Затем я использую его, введя следующую ...

<img src="<?php echo DOC_URL; ?>/_img/logo.png" /> 
Смежные вопросы