web-dev-qa-db-fra.com

Comment obtenir une URL de base avec PHP?

J'utilise XAMPP sur Windows Vista. Dans mon développement, j'ai http://127.0.0.1/test_website/.

Comment obtenir http://127.0.0.1/test_website/ avec PHP?

J'ai essayé quelque chose comme ça, mais aucun d'entre eux n'a fonctionné.

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
108
shin

Essaye ça:

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

En savoir plus sur la $_SERVER Variable prédéfinie

Si vous envisagez d'utiliser https, vous pouvez utiliser ceci:

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

Per cette réponse , s’il vous plaît assurez-vous de configurer votre Apache correctement afin que vous puissiez dépendre en toute sécurité de SERVER_NAME.

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

NOTE: Si vous dépendez de la clé HTTP_Host (qui contient une entrée utilisateur), vous devez encore effectuer un nettoyage, supprimer des espaces, des virgules, des retours à la ligne, tout ce qui n'est pas un caractère valide pour un domaine. Vérifiez php builtin parse_url functions par exemple.

225
maček

Fonction ajustée pour exécuter sans avertissements:

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'];
}
24
ftrotter

Extrait 'base_url' amusant!

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

Utilisez aussi simple que:

//  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/"
//      }
18
SpYk3HH
$modifyUrl = parse_url($url);
print_r($modifyUrl)

C'est juste simple à utiliser
Sortie:

Array
(
    [scheme] => http
    [Host] => aaa.bbb.com
    [path] => /
)
13
agravat.in
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Usage:

print "<script src='{$base_url}js/jquery.min.js'/>";
11
user3832931

Je pense que le $_SERVER superglobal contient les informations que vous recherchez. Cela pourrait être quelque chose comme ça:

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

Vous pouvez voir la documentation PHP correspondante ici .

5
Jeremy DeGroot

Le code suivant réduira le problème de vérification du protocole. Le $ _SERVER ['APP_URL'] affichera le nom de domaine avec le protocole

$ _SERVER ['APP_URL'] va retourner protocole: // domaine (par exemple: - http: // localhost )

$ _SERVER ['REQUEST_URI'] pour les parties restantes de l'URL telles que / répertoire/sous-répertoire/quelque chose/else

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

La sortie serait comme ça 

http: // hôte local/répertoire/sous-répertoire/quelque chose/else

3
Jijesh Cherrai

Astuce simple et facile:

$Host  = $_SERVER['HTTP_Host'];
$Host_upper = strtoupper($Host);
$path   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$baseurl = "http://" . $Host . $path . "/";

L'URL ressemble à ceci: http://example.com/folder/

2
Ali Akhtar

J'ai trouvé ceci sur http://webcheatsheet.com/php/get_current_page_url.php

Ajoutez le code suivant à une page:

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

Vous pouvez maintenant obtenir l'URL de la page actuelle en utilisant la ligne:

<?php
  echo curPageURL();
?>

Parfois, il est nécessaire d’obtenir le nom de la page uniquement. L'exemple suivant montre comment procéder: 

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

echo "The current page name is ".curPageName();
?>
2
Hoàng Vũ Tgtt

tu peux faire comme ça

mais désolé mon anglais n'est pas assez bon,

d'abord obtenir l'URL de base à la maison avec ce code simple ..

j'ai testé ce code par le serveur local et public et le résultat est bon ..

<?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();

la sortie sera comme ceci:

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

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

utilisez la fonction home_base_url à index.php de votre site web et définissez-le

et alors vous pouvez utiliser cette fonction pour charger le script, le css et le contenu via une URL comme

<?php

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

?>

créera une sortie comme ceci:

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

et si ce script fonctionne bien ,!

2
Crazy SagaXxX

Essaye ça. Ça marche pour moi.

/*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]);
    }
}

Utilisez comme ceci:

<?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>
2
Ali

Essayez le code suivant:

$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'];
1
rrsantos

Modifié à la réponse de @ user3832931 pour inclure le port du serveur.

former des URL comme ' https: // localhost: 8000/folder/ '

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
1
Badmus Taofeeq

Dans mon cas, j'avais besoin d'une URL de base similaire à celle de la variable RewriteBasecontenue dans le fichier .htaccess.

Malheureusement, il est impossible de récupérer la variable RewriteBase à partir du fichier .htaccess avec PHP. Mais il est possible de définir une variable d'environnement dans le fichier .htaccess, puis de récupérer cette variable en PHP. Il suffit de vérifier ces bits de code:

.htaccess

SetEnv BASE_PATH /

index.php

Maintenant, je l'utilise dans la balise de base du modèle (dans la section principale de la page):

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

Donc, si la variable n'était pas vide, nous l'utilisons. Sinon, repliez sur / comme chemin de base par défaut.

Selon l'environnement, l'URL de base sera toujours correcte. J'utilise / comme URL de base sur les sites Web locaux et de production. Mais /foldername/ pour l'environnement de transfert.

Ils avaient tous leur propre .htaccess en premier lieu parce que RewriteBase était différent. Donc, cette solution fonctionne pour moi.

0
Floris

Juste tester et obtenir le résultat.

// 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']."/";
0
Anjani Barnwal

Essayez d'utiliser: $_SERVER['SERVER_NAME'];

Je l'ai utilisé pour faire écho à l'URL de base de mon site pour lier mes css.

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

J'espère que cela t'aides!

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

et vous obtenez quelque chose comme 

lalala/tralala/something/
0
Milos Milosevic

En voici un que je viens de mettre en place et qui fonctionne pour moi. Il retournera un tableau avec 2 éléments. Le premier élément est tout avant le? et le second est un tableau contenant toutes les variables de chaîne de requête d'un tableau associatif. 

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;

}

Note: Ceci est un développement de la réponse fournie par maček ci-dessus. (Crédit où le crédit est dû.)

0
Kenny

J'avais la même question que le PO, mais peut-être une exigence différente. J'ai créé cette fonction ...

/**
 * 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;

}

... que j'utilise d'ailleurs pour créer des URL absolues à utiliser pour la redirection.

0
ban-geoengineering
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;

}
0
Devarajan Sekaran
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

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