2013-05-01 2 views
0

Я хочу, чтобы иметь возможность получить хост и подпапку определенного сайта. Например: получить http://example:81/test/ от http://example:81/test/pagename.php.Устранение хоста + подкаталога url в PHP

Он также должен работать с тем же адресом http://example:81/test/ и с несколькими уровнями подпапок, такими как http://example:81/test/test2/somepage.php.

Он не должен получать структуру файла в самой папке, такой как http://example:81/test/images/page.php должен все еще быть http://example:81/test/, а не http://example:81/test/images/.

Я попытался с помощью

$_SERVER['HTTP_HOST'] // only provides example:81 
$_SERVER['REQUEST_URI'] // provides full path example:81/test/images/ 

По сути, я хочу, чтобы это URL файла index.php, даже если он находится в подпапке.

Есть ли способ достичь этого?

+0

Вы можете попробовать сделать это с регулярным выражением, не может думать ни о чем простом – piSHOCK

+0

Как вы можете сделать разницу между субдоменом и простым подкаталоге как 'images'? 'parse_url' позволит вам извлечь все части URL-адреса, но не будет знать, является ли его субдомен или простой каталог, эти функции работают в строке, вот и все. – MatRt

+0

Субдомен @MatRt поступает перед доменом, и подкаталог появляется после /. например 'test.example.com/foo/bar.php',' test' является частью поддомена для host 'test.example.com' и'/foo/'является подкаталогом. –

ответ

3

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

<?php 
$url = 'http'.(isset($_SERVER['HTTPS'])?'s':'').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 

Если вы хотите подробностей того, вы можете использовать parse_url()

<?php 
$details = parse_url($url); 
print_r($details); 

будет выводить что-то вроде:

Array 
(
    [scheme] => http 
    [host] => example.com 
    [port] => 81 
    [path] => /test/test2/ 
    [query] => somepage.php 
) 

Edit:

Если вы хотите путь в файл вы можете использовать $_SERVER['PHP_SCRIPT'], чтобы получить имя вызываемого скрипта относительно документа ro ot или $_SERVER['SCRIPT_FILENAME'], чтобы получить путь к серверу, включая корень документа. Существуют также встроенные константы __DIR__ и __FILE__, которые имеют путь к текущему сценарию сервера, даже если они включены. Все они могут использоваться с dirname(), чтобы получить каталог переменной и basename(), чтобы получить только имя файла. Существует также $_SERVER['DOCUMENT_ROOT'], который имеет путь до корня сети.

Итак, чтобы получить путь по тому же каталогу, в котором находится этот скрипт, если вызывается скрипт /var/www/test/index.php, вы можете использовать dirname(__FILE__).'/some/sub/dir/'.

Вы можете увидеть все переменные сервера, просто сделав print_r $_SERVER, или даже лучше вы можете позвонить phpinfo(), чтобы получить хороший вывод всех определенных модулей и переменных php.

+0

Я предполагаю, что мой вопрос был слишком конкретным, чтобы полностью ответить (без моего кода). Ваш ответ был очень полезен. Есть ли какой-либо способ выразить первый образец кода, или он, безусловно, является «лучшим» способом, каким он есть? Кроме того, $ _SERVER [HTTP_HOST] возвращается с портом уже, поэтому, если я использую ваш код, так как я получаю дублированный порт, каким-либо образом, или мне даже нужно беспокоиться, так как порт всегда включен в http_host? – DominicM

+0

@ DominicM Это единственный способ узнать. И у меня нет сервера на нестандартном порту, поэтому я не знал, что порт был включен в 'HTTP_HOST'. Вы можете удалить часть порта (я отредактирую и удалю его). Если вам не нужно переключаться между http/https, вы также можете удалить чек для https. Здесь вы можете увидеть другие примеры: http://stackoverflow.com/questions/6768793/php-get-the-full-url –

0

У меня была аналогичная проблема в моем проекте; Я хотел иметь возможность получить subfolder через имя файла сценария (и т. д. index.php) Я пробовал некоторые методы, но работал следующий (уродливый) метод. Хитрость заключается в том, чтобы «подавать» метод со всеми возможными «местами», в которых могут существовать все .php-файлы.

Если script name находится в одном из этих мест, то subtract та часть ЛЕВЫЙ из этих мест; эта часть должна быть subfolder (если таковая имеется).

Да, его уродливый, но работал на меня ...

$string = $_SERVER["SCRIPT_NAME"]; 
$subfolder = NULL; 
// tries to find the 'subfolder' by checking all possible PHP calls 
$places = array("/","plugins/","system/php"); 
foreach($places as $key=>$val) { 
    $pos = strpos($string,$val); 
    if ($pos !== FALSE && !isset($subfolder)) { 
    $subfolder = substr($string,0,$pos-1); 
    break; 
    } 
} 
+0

Я закончил просто вычитание имен ссылок, которые у меня были в массиве из текущего URL, а затем добавление его до конца, если это не выбранная в данный момент ссылка. – DominicM