Wie erhalte ich die Basis-URL mit PHP?

139

Ich verwende XAMPP unter Windows Vista. In meiner Entwicklung habe ich http://127.0.0.1/test_website/.

Wie komme ich http://127.0.0.1/test_website/mit PHP?

Ich habe so etwas versucht, aber keiner von ihnen hat funktioniert.

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
Schienbein
quelle
1
Wie haben sie nicht funktioniert? Was sind sie zurückgekehrt?
Animuson
6
@animuson Diese Konstanten geben lokale Dateisystempfade zurück, keine URLs.
Ceejayoz
Mögliches Duplikat von Holen Sie sich die vollständige URL in PHP
T.Todua

Antworten:

251

Versuche dies:

<?php echo "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; ?>

Erfahren Sie mehr über die $_SERVERvordefinierte Variable .

Wenn Sie https verwenden möchten, können Sie Folgendes verwenden:

function url(){
  return sprintf(
    "%s://%s%s",
    isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
    $_SERVER['SERVER_NAME'],
    $_SERVER['REQUEST_URI']
  );
}

echo url();
#=> http://127.0.0.1/foo

Stellen Sie gemäß dieser Antwort sicher, dass Sie Ihren Apache richtig konfigurieren, damit Sie sich sicher darauf verlassen können SERVER_NAME.

<VirtualHost *>
    ServerName example.com
    UseCanonicalName on
</VirtualHost>

HINWEIS : Wenn Sie vom HTTP_HOSTSchlüssel abhängig sind (der Benutzereingaben enthält), müssen Sie noch einige Bereinigungen vornehmen, Leerzeichen, Kommas, Zeilenumbrüche usw. entfernen. Alles, was für eine Domain kein gültiges Zeichen ist. Überprüfen Sie die in PHP integrierte parse_url- Funktion für ein Beispiel.

maček
quelle
2
Sollte einchecken $_SERVER['HTTPS']und eintauschen https://anstatt http://in diesen Fällen.
Ceejayoz
2
Dank dir brauchte ich diese Funktion.
Brice Favre
2
was ist mit $ _SERVER ['REQUEST_SCHEME']? ist das nicht einfacher?
frostymarvelous
2
Dies funktioniert nicht, wenn Sie einen anderen Port als 80 verwenden. :(
M'sieur Toph '10.
1
@admdrew danke. Ich habe noch einmal überprüft, dass REQUEST_URIbereits ein /; es tut. @swarnendu Bitte seien Sie vorsichtiger, wenn Sie die Antworten anderer Personen bearbeiten. Das hätte stattdessen ein Kommentar sein sollen.
Maček
28

Funktion angepasst, um ohne Warnungen ausgeführt zu werden:

function url(){
    if(isset($_SERVER['HTTPS'])){
        $protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
    }
    else{
        $protocol = 'http';
    }
    return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
ftrotter
quelle
1
Ich wusste, dass ich das schon einmal gemacht hatte und konnte mich aus irgendeinem Grund nicht daran erinnern, wie. Vielen Dank!
Kyle Coots
Ich muss die Home-URL auf das Header-Bild einstellen. Wenn sich der Benutzer auf einer anderen Seite als der Startseite befindet, sollte er durch Klicken auf das Header-Bild zur Startseite weitergeleitet werden. Wie kann ich das machen?
Joey
21

Fun 'base_url' Snippet!

if (!function_exists('base_url')) {
    function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
        if (isset($_SERVER['HTTP_HOST'])) {
            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
            $core = $core[0];

            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
            $base_url = sprintf( $tmplt, $http, $hostname, $end );
        }
        else $base_url = 'http://localhost/';

        if ($parse) {
            $base_url = parse_url($base_url);
            if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
        }

        return $base_url;
    }
}

Verwenden Sie so einfach wie:

//  url like: http://stackoverflow.com/questions/2820723/how-to-get-base-url-with-php

echo base_url();    //  will produce something like: http://stackoverflow.com/questions/2820723/
echo base_url(TRUE);    //  will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE);    //  will produce something like: http://stackoverflow.com/questions/
//  and finally
echo base_url(NULL, NULL, TRUE);
//  will produce something like: 
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/2820723/"
//      }
SpYk3HH
quelle
15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Verwendung:

print "<script src='{$base_url}js/jquery.min.js'/>";
user3832931
quelle
13
$modifyUrl = parse_url($url);
print_r($modifyUrl)

Es ist einfach zu bedienen.
Ausgabe:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)
agravat.in
quelle
1
Es ist nicht der beste Weg, um eine Basis-URL zu erhalten.
Anjani Barnwal
@AnjaniBarnwal kannst du erklären warum? Ich denke, dies ist der beste Weg, wenn Sie eine Zeichenfolge mit einer URL haben und die Basis-URL wie https://example.comvon erhalten möchten https://example.com/category2/page2.html?q=2#lorem-ipsum- das hat nichts mit der aktuellen Seite zu tun, auf der Sie sich befinden.
OZZIE
7

Ich denke, der $_SERVERSuperglobal hat die Informationen, die Sie suchen. Es könnte ungefähr so ​​aussehen:

echo $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']

Die entsprechende PHP-Dokumentation finden Sie hier .

Jeremy DeGroot
quelle
Dadurch wird immer wieder auf dieselbe Seite umgeleitet, auf der sich der Benutzer gerade befindet. Wie kann ich das beheben, um zur Startseite umzuleiten? Ich bin auf Apache, localhost. PHP7
Joey
5

Versuchen Sie den folgenden Code:

$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
echo $config['base_url'];
rrsantos
quelle
4

Der folgende Code reduziert das Problem beim Überprüfen des Protokolls. Der $ _SERVER ['APP_URL'] zeigt den Domänennamen mit dem Protokoll an

$ _SERVER ['APP_URL'] gibt das Protokoll zurück: // domain (zB: - http: // localhost )

$ _SERVER ['REQUEST_URI'] für verbleibende Teile der URL wie / Verzeichnis / Unterverzeichnis / etwas / anderes

 $url = $_SERVER['APP_URL'].$_SERVER['REQUEST_URI'];

Die Ausgabe wäre so

http: // localhost / Verzeichnis / Unterverzeichnis / etwas / anderes

Jijesh Cherrai
quelle
1
Erklären Sie, was Sie getan haben und warum, anstatt nur eine zufällige Menge Code einzufügen. Auf diese Weise können das OP und alle zukünftigen Leser mit demselben Problem tatsächlich etwas aus Ihrer Antwort lernen, anstatt es nur zu kopieren / einzufügen und morgen dieselbe Frage erneut zu stellen.
Oldskool
3

Ich habe dies auf http://webcheatsheet.com/php/get_current_page_url.php gefunden

Fügen Sie einer Seite den folgenden Code hinzu:

<?php
function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}
?>

Sie können jetzt die aktuelle Seiten-URL über die folgende Zeile abrufen:

<?php
  echo curPageURL();
?>

Manchmal ist es erforderlich, nur den Seitennamen abzurufen. Das folgende Beispiel zeigt, wie es geht:

<?php
function curPageName() {
 return substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
}

echo "The current page name is ".curPageName();
?>
Hoàng Vũ Tgtt
quelle
2
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

$url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];
Farid Bangash
quelle
2

Versuche dies. Für mich geht das.

/*url.php file*/

trait URL {
    private $url = '';
    private $current_url = '';
    public $get = '';

    function __construct()
    {
        $this->url = $_SERVER['SERVER_NAME'];
        $this->current_url = $_SERVER['REQUEST_URI'];

        $clean_server = str_replace('', $this->url, $this->current_url);
        $clean_server = explode('/', $clean_server);

        $this->get = array('base_url' => "/".$clean_server[1]);
    }
}

Verwenden Sie wie folgt:

<?php
/*
Test file

Tested for links:

http://localhost/index.php
http://localhost/
http://localhost/index.php/
http://localhost/url/index.php    
http://localhost/url/index.php/  
http://localhost/url/ab
http://localhost/url/ab/c
*/

require_once 'sys/url.php';

class Home
{
    use URL;
}

$h = new Home();

?>

<a href="<?=$h->get['base_url']?>">Base</a>
Ali
quelle
2

Einfacher und leichter Trick:

$host  = $_SERVER['HTTP_HOST'];
$host_upper = strtoupper($host);
$path   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$baseurl = "http://" . $host . $path . "/";

Die URL sieht folgendermaßen aus: http://example.com/folder/

Ali Akhtar
quelle
2

Sie können es so machen, aber leider ist mein Englisch nicht gut genug.

Holen Sie sich zuerst die Basis-URL mit diesem einfachen Code.

Ich habe diesen Code auf meinem lokalen Server und in der Öffentlichkeit getestet und das Ergebnis ist gut.

<?php

function home_base_url(){   

// first get http protocol if http or https

$base_url = (isset($_SERVER['HTTPS']) &&

$_SERVER['HTTPS']!='off') ? 'https://' : 'http://';

// get default website root directory

$tmpURL = dirname(__FILE__);

// when use dirname(__FILE__) will return value like this "C:\xampp\htdocs\my_website",

//convert value to http url use string replace, 

// replace any backslashes to slash in this case use chr value "92"

$tmpURL = str_replace(chr(92),'/',$tmpURL);

// now replace any same string in $tmpURL value to null or ''

// and will return value like /localhost/my_website/ or just /my_website/

$tmpURL = str_replace($_SERVER['DOCUMENT_ROOT'],'',$tmpURL);

// delete any slash character in first and last of value

$tmpURL = ltrim($tmpURL,'/');

$tmpURL = rtrim($tmpURL, '/');


// check again if we find any slash string in value then we can assume its local machine

    if (strpos($tmpURL,'/')){

// explode that value and take only first value

       $tmpURL = explode('/',$tmpURL);

       $tmpURL = $tmpURL[0];

      }

// now last steps

// assign protocol in first value

   if ($tmpURL !== $_SERVER['HTTP_HOST'])

// if protocol its http then like this

      $base_url .= $_SERVER['HTTP_HOST'].'/'.$tmpURL.'/';

    else

// else if protocol is https

      $base_url .= $tmpURL.'/';

// give return value

return $base_url; 

}

?>

// and test it

echo home_base_url();

Die Ausgabe wird wie folgt aussehen:

local machine : http://localhost/my_website/ or https://myhost/my_website 

public : http://www.my_website.com/ or https://www.my_website.com/

Verwenden Sie die home_base_urlFunktion index.phpIhrer Website und definieren Sie sie

und dann können Sie diese Funktion verwenden, um Skripte, CSS und Inhalte über URL wie zu laden

<?php

echo '<script type="text/javascript" src="'.home_base_url().'js/script.js"></script>'."\n";

?>

erstellt eine Ausgabe wie folgt:

<script type="text/javascript" src="http://www.my_website.com/js/script.js"></script>

und wenn dieses Skript gut funktioniert ,,!

Verrückte SagaXxX
quelle
2
Bitte fügen Sie keine Links zu Ihren Websites in Ihre Antworten ein
ChrisF
1

Hier ist eine, die ich gerade zusammengestellt habe und die für mich funktioniert. Es wird ein Array mit 2 Elementen zurückgegeben. Das erste Element ist alles vor dem? und das zweite ist ein Array, das alle Abfragezeichenfolgenvariablen in einem assoziativen Array enthält.

function disectURL()
{
    $arr = array();
    $a = explode('?',sprintf(
        "%s://%s%s",
        isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
        $_SERVER['SERVER_NAME'],
        $_SERVER['REQUEST_URI']
    ));

    $arr['base_url']     = $a[0];
    $arr['query_string'] = [];

    if(sizeof($a) == 2)
    {
        $b = explode('&', $a[1]);
        $qs = array();

        foreach ($b as $c)
        {
            $d = explode('=', $c);
            $qs[$d[0]] = $d[1];
        }
        $arr['query_string'] = (count($qs)) ? $qs : '';
    }

    return $arr;

}

Hinweis: Dies ist eine Erweiterung der Antwort von maček oben. (Gutschrift, wo Gutschrift fällig ist.)

Kenny
quelle
1

Bearbeitet unter der Antwort von @ user3832931, um den Server-Port einzuschließen.

um URLs wie ' https: // localhost: 8000 / folder / ' zu bilden

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Badmus Taofeeq
quelle
0
function server_url(){
    $server ="";

    if(isset($_SERVER['SERVER_NAME'])){
        $server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME'], '/');
    }
    else{
        $server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_ADDR'], '/');
    }
    print $server;

}
Devarajan Sekaran
quelle
0

Versuchen Sie es mit: $_SERVER['SERVER_NAME'];

Ich habe es verwendet, um die Basis-URL meiner Website wiederzugeben und mein CSS zu verlinken.

<link href="https://<?php echo $_SERVER['SERVER_NAME']; ?>/assets/css/your-stylesheet.css" rel="stylesheet" type="text/css">

Hoffe das hilft!

KAZZABE
quelle
0

Ich hatte die gleiche Frage wie das OP, aber vielleicht eine andere Anforderung. Ich habe diese Funktion erstellt ...

/**
 * Get the base URL of the current page. For example, if the current page URL is
 * "https://example.com/dir/example.php?whatever" this function will return
 * "https://example.com/dir/" .
 *
 * @return string The base URL of the current page.
 */
function get_base_url() {

    $protocol = filter_input(INPUT_SERVER, 'HTTPS');
    if (empty($protocol)) {
        $protocol = "http";
    }

    $host = filter_input(INPUT_SERVER, 'HTTP_HOST');

    $request_uri_full = filter_input(INPUT_SERVER, 'REQUEST_URI');
    $last_slash_pos = strrpos($request_uri_full, "/");
    if ($last_slash_pos === FALSE) {
        $request_uri_sub = $request_uri_full;
    }
    else {
        $request_uri_sub = substr($request_uri_full, 0, $last_slash_pos + 1);
    }

    return $protocol . "://" . $host . $request_uri_sub;

}

... die ich übrigens verwende, um absolute URLs zu erstellen, die für die Umleitung verwendet werden sollen.

Ban-Geoengineering
quelle
0
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

und du bekommst so etwas wie

lalala/tralala/something/
Milos Milosevic
quelle
Dieser Q & A-Eintrag enthält viel Code, der in die Gefahrenzone gehört, auch diesen, insbesondere aufgrund der Verwendung von PHP_SELF.
hakre
0

Testen Sie einfach und erhalten Sie das Ergebnis.

// output: /myproject/index.php
$currentPath = $_SERVER['PHP_SELF'];
// output: Array ( [dirname] => /myproject [basename] => index.php [extension] => php [filename] => index ) 
$pathInfo = pathinfo($currentPath);
// output: localhost
$hostName = $_SERVER['HTTP_HOST'];
// output: http://
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https://'?'https://':'http://';
// return: http://localhost/myproject/
echo $protocol.$hostName.$pathInfo['dirname']."/";
Anjani Barnwal
quelle
0

In meinem Fall benötigte ich eine Basis-URL ähnlich der RewriteBasein der .htaccessDatei enthaltenen.

Leider ist es mit PHP nicht möglich , das einfach RewriteBaseaus der .htaccessDatei abzurufen . Es ist jedoch möglich , eine Umgebungsvariable in der .htaccess-Datei festzulegen und diese Variable dann in PHP abzurufen. Überprüfen Sie einfach diese Codebits:

.htaccess

SetEnv BASE_PATH /

index.php

Jetzt verwende ich dies im Basis-Tag der Vorlage (im Kopfbereich der Seite):

<base href="<?php echo ! empty( getenv( 'BASE_PATH' ) ) ? getenv( 'BASE_PATH' ) : '/'; ?>"/>

Wenn die Variable also nicht leer war, verwenden wir sie. Andernfalls wird auf /den Standardbasispfad zurückgegriffen.

Abhängig von der Umgebung ist die Basis-URL immer korrekt. Ich verwende /als Basis-URL auf lokalen und Produktions-Websites. Aber /foldername/für die Staging-Umgebung.

Sie hatten alle ihre eigenen, .htaccessweil die RewriteBase anders war. Diese Lösung funktioniert also für mich.

Floris
quelle
0

Schauen Sie sich $ _SERVER ['REQUEST_URI'] an, dh

$current_url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

Wenn Sie sowohl HTTP als auch HTTPS unterstützen möchten, können Sie diese Lösung verwenden

$current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

Das hat bei mir funktioniert. Ich hoffe, das wird dir auch helfen. Vielen Dank, dass Sie diese Frage gestellt haben.

Kamlesh
quelle