2013-08-13 33 views
18

Może być trywialne pytanie, ale szukam sposób powiedzieć dostać korzeń adres URL witryny, na przykład: http://localhost/some/folder/containing/something/here/or/there powinien powrócić http://localhost/Jak uzyskać adres URL strony głównej?

wiem, że jest $_SERVER['DOCUMENT_ROOT'] ale to nie to, co chcę.

Jestem pewien, że to jest łatwe, ale czytałem: This post próbuje dowiedzieć się, co powinienem użyć lub zadzwonić.

Pomysły?

Inne pytanie mam, która jest w stosunku do tego jest - co będzie kiedykolwiek odpowiedź byłaby praca na stronach takich jak http://subsite.localhost/some/folder/containing/something/here/or/there więc mój wynik końcowy jest http://subsite.localhost/

+3

Spójrz [parse_url()] (http : //php.net/manual/en/function.parse-url.php) –

+0

jeśli masz jeden punkt wejścia dla swojej witryny i/lub zawsze dołączasz plik konfiguracyjny, którego możesz użyć [to rozwiązanie] (http: ///stackoverflow.com/a/23864090/1815624). – CrandellWS

Odpowiedz

33
$root = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . '/'; 

Jeśli jesteś zainteresowany obecny schemat skryptu i host.

W przeciwnym razie parse_url(), jak już sugerowano. na przykład

$parsedUrl = parse_url('http://localhost/some/folder/containing/something/here/or/there'); 
$root = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . '/'; 

Jeśli jesteś zainteresowany również w innych składników URL stanu na ścieżkę (np poświadczeń), można też użyć strstr() na pełny adres URL, z „ścieżki”, jak igły, na przykład

$url = 'http://user:[email protected]:80/some/folder/containing/something/here/or/there'; 
$parsedUrl = parse_url($url); 
$root = strstr($url, $parsedUrl['path'], true) . '/';//gives 'http://user:[email protected]:80/' 
+0

Czytam 'parse_url()' i nie rozumiem, jak skonfigurować go, aby dać mi, co chcę. Jakieś pomysły? Przepraszam. ale dzięki za pomoc. – Adam

+1

@Adam Zmieniono powyższą odpowiedź na przykład dla parse_url(). To naprawdę proste - daje asocjacyjną tablicę ze wszystkimi komponentami URL i wybierasz te, które chcesz. W twoim przypadku schemat i host. –

+0

@boen_robot: dobra robota, ale nie pomijaj rzeczy takich jak nazwa użytkownika, numery portów itp., Które mogą tam być, zobacz [tutaj na przykład] (https://github.com/akky/anti-hatena-bookmark /blob/master/http_build_url.php#L106) – Wrikken

7

Innym prostym sposobem:

<?php 
$hostname = getenv('HTTP_HOST'); 
echo $hostname; 

getenv

(PHP 4, PHP 5)

getenv - Pobiera wartość zmiennej środowiskowej

+0

Ładne i małe, ale nie zawierają one' http' bit –

0

Można preg_split adres URL na pierwszym singlu / - Charakter:

function rootUrl($url) { 
    $urlParts = preg_split('#(?<!/)/(?!/)#', $url, 2); 
    return $urlParts[0] != '' ? $urlParts[0] . '/' : ''; 
} 

// examples: 

echo rootUrl('http://[email protected]/path/to/file?query=string'); 
// output: http://[email protected]/ 

echo rootUrl('https://www.example.com/'); 
// output: https://www.example.com/ 

echo rootUrl('https://www.example.com'); 
// output: https://www.example.com/ 

echo rootUrl('example.com/path/to/file'); 
// output: example.com/ 

echo rootUrl('/path/to/file'); 
// output: [empty] 

echo rootUrl(''); 
// output: [empty] 

Funkcja rootUrl($url) zwraca część danego łańcucha $url przed pierwszym / dwuznakowego plus spływu / jeśli pierwsza część nie jest pusta. Dla adresów URL rozpoczynających się od / (względne adresy URL) zwracany jest pusty ciąg znaków.

5

Ta funkcja PHP zwraca prawdziwy adres URL pełnej ścieżki.

function pathUrl($dir = __DIR__){ 

    $root = ""; 
    $dir = str_replace('\\', '/', realpath($dir)); 

    //HTTPS or HTTP 
    $root .= !empty($_SERVER['HTTPS']) ? 'https' : 'http'; 

    //HOST 
    $root .= '://' . $_SERVER['HTTP_HOST']; 

    //ALIAS 
    if(!empty($_SERVER['CONTEXT_PREFIX'])) { 
     $root .= $_SERVER['CONTEXT_PREFIX']; 
     $root .= substr($dir, strlen($_SERVER[ 'CONTEXT_DOCUMENT_ROOT' ])); 
    } else { 
     $root .= substr($dir, strlen($_SERVER[ 'DOCUMENT_ROOT' ])); 
    } 

    $root .= '/'; 

    return $root; 
} 

Call of pathUrl w tym pliku: http://example.com/shop/index.php

#index.php 

echo pathUrl(); 
//http://example.com/shop/ 

Pracuj z aliasu: http://example.com/alias-name/shop/index.php

#index.php 

echo pathUrl(); 
//http://example.com/alias-name/shop/ 

Dla podkatalogu: http://example.com/alias-name/shop/inc/config.php

#config.php 

echo pathUrl(__DIR__ . '/../'); 
//http://example.com/alias-name/shop/ 
+0

Usunąłem twoje linki do localhost, inne osoby, które odwiedzają internet na różnych komputerach nie ma dostępu do twojego lokalnego hosta. Również twój drugi link do /myweb.com/tests/ nie rozwiązuje problemu. –

+0

Dziękuję, proszę pana! Dokładnie to, czego szukałem! : D –

+0

nie ma za co;) – fallinov

1

Można używając Define zapisać na define.php należą do następnego użycia czas na inne przedsięwzięcia To PROTOCOLDOMAINPORTSITE_ROOT I SITE PATH

** 
* domain 
* ex: localhost, maskphp.com, demo.maskphp.com,... 
*/ 
define('DOMAIN', isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']); 

/** 
* protocol 
* ex: http, https,... 
*/ 
define('PROTOCOL', isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === 1) 
    || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http'); 

/** 
* port 
* ex: 80, 8080,... 
*/ 
define('PORT', $_SERVER['SERVER_PORT']); 

/** 
* site path 
* ex: http://localhost/maskphp/ -> /maskphp/ 
*/ 
define('SITE_PATH', preg_replace('/index.php$/i', '', $_SERVER['PHP_SELF'])); 

/** 
* site root 
* ex: http://maskgroup.com, http://localhost/maskphp/,... 
*/ 
define('SITE_ROOT', PROTOCOL . '://' . DOMAIN . (PORT === '80' ? '' : ':' . PORT) . SITE_PATH); 

można debugować zobaczyć spowodować

Powiązane problemy