2013-08-13 18 views
18

Könnte eine triviale Frage, aber ich für eine Art und Weise suchen die Wurzel eines Website-URL zu sagen zu bekommen, zum Beispiel: http://localhost/some/folder/containing/something/here/or/therehttp://localhost/Wie bekomme ich die Root-URL der Website?

zurückkehren sollte ich es wissen, ist $_SERVER['DOCUMENT_ROOT'] aber das ist nicht das, was ich will.

Ich bin sicher, das ist einfach, aber ich habe gelesen: This post versuchen, herauszufinden, was ich verwenden oder anrufen sollte.

Ideen?

Die andere Frage, die ich habe, die diese in Beziehung ist - wird, was auch immer die Antwort sein, die Arbeit an Websites wie http://subsite.localhost/some/folder/containing/something/here/or/there so mein Endergebnis http://subsite.localhost/

+3

Blick auf [parse_url()] (http : //php.net/manual/en/function.parse-url.php) –

+0

Wenn Sie einen einzigen Einstiegspunkt für Ihre Website haben und/oder Sie immer eine Konfigurationsdatei enthalten, können Sie [diese Lösung] (http: // /stackoverflow.com/a/23864090/1815624). – CrandellWS

Antwort

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

ist Wenn Sie interessiert sind, das Schema und der Host des aktuellen Skripts.

Andernfalls parse_url(), wie bereits vorgeschlagen. z.B.

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

Wenn Sie in anderen URL-Komponenten vor dem Pfad auch daran interessiert sind (zum Beispiel Anmeldeinformationen), können Sie auch strstr() auf der vollen URL verwenden, mit dem „Pfad“, wie die Nadel, z.B.

$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

Ich lese 'parse_url()' und ich verstehe nicht, wie ich es einrichten würde, um mir zu geben, was ich will. Irgendwelche Ideen? Es tut uns leid. aber danke für deine Hilfe. – Adam

+1

@Adam Ich habe die obige Antwort mit einem Beispiel für parse_url() geändert. Es ist wirklich einfach - es gibt Ihnen ein assoziatives Array mit allen URL-Komponenten, und Sie wählen Sie, die Sie wollen. In Ihrem Fall, Schema und Host. –

+0

@boen_robot: Gute Arbeit, aber lass keine Sachen wie den Benutzernamen, Portnummern usw., die da drin sein könnten, weg [hier zum Beispiel] (https://github.com/akky/anti-hatena-bookmark /blob/master/http_build_url.php#L106) – Wrikken

7

Eine weitere einfache Möglichkeit:

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

getenv

(PHP 4, PHP 5)

getenv - Zeigt den Wert einer Umgebungsvariablen

+0

Schön und klein, aber es enthält nicht das' http' Bit –

0

Sie können preg_split die URL bei der ersten Single / - 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] 

Die Funktion rootUrl($url) den Teil des gegebenen Zeichenkette $url vor dem ersten / -Charakter plus / wenn der ersten Teil nicht leer ist nachzulaufzurückgibt. Für URLs, die mit / (relative URLs) beginnen, wird eine leere Zeichenfolge zurückgegeben.

5

Diese PHP-Funktion gibt die echte URL eines vollständigen Pfads zurück.

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; 
} 

Aufruf von pathUrl in dieser Datei: http://example.com/shop/index.php

#index.php 

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

Arbeit mit Alias: http://example.com/alias-name/shop/index.php

#index.php 

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

Für Unterverzeichnis: http://example.com/alias-name/shop/inc/config.php

#config.php 

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

Ich entfernte Ihre Links zu localhost, andere Leute, die das Internet auf verschiedenen Computern besuchen habe keinen Zugang zu deiner localhost-Box. Auch dein anderer Link zu /myweb.com/tests/ löst nicht auf. –

+0

Vielen Dank, mein Herr! Genau das, was ich gesucht habe! : D –

+0

Gern geschehen;) – fallinov

1

Sie können mit Define sparen define.php für das nächste Mal den Einsatz auf anderen Projekt Dazu gehören ist PROTOCOLDOMAINPORTSITE_ROOT UND 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); 

Sie können zu sehen, debuggen führen

Verwandte Themen