Comment obtenir l'URL de base avec PHP?

139

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.
tibia
la source
1
Comment n'ont-ils pas fonctionné? Qu'ont-ils retourné?
animuson
6
@animuson Ces constantes renvoient des chemins de système de fichiers locaux, pas des URL.
ceejayoz
duplication possible de Obtenir l'URL complète en PHP
T.Todua

Réponses:

251

Essaye ça:

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

En savoir plus sur la $_SERVERvariable prédéfinie .

Si vous prévoyez 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

Selon cette réponse , assurez-vous de configurer correctement votre Apache afin de pouvoir compter sur SERVER_NAME.

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

REMARQUE : si vous dépendez de la HTTP_HOSTclé (qui contient l'entrée utilisateur), vous devez toujours effectuer un nettoyage, supprimer des espaces, des virgules, un retour chariot, etc. Tout ce qui n'est pas un caractère valide pour un domaine. Vérifiez la fonction PHP intégrée parse_url pour un exemple.

maček
la source
2
Devrait vérifier $_SERVER['HTTPS']et échanger au https://lieu de http://dans ces cas.
ceejayoz
2
Grâce à vous, j'avais besoin de cette fonction.
Brice Favre
2
qu'en est-il de $ _SERVER ['REQUEST_SCHEME']? n'est-ce pas plus simple?
frostymarvelous
2
Cela ne fonctionne pas si vous utilisez un port différent de 80. :(
M'sieur Toph '10
1
@admdrew merci. J'ai revérifié qui REQUEST_URIcomprend déjà un /; Cela fait. @swarnendu , soyez plus prudent lorsque vous modifiez les réponses des autres. Cela aurait dû être un commentaire à la place.
maček
28

Fonction ajustée pour s'exécuter sans avertissement:

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
la source
1
Je savais que j'avais fait ça avant, je ne me souvenais pas comment pour une raison quelconque. Merci!
Kyle Coots
Je dois définir l'URL d'accueil sur l'image d'en-tête. lorsque l'utilisateur est sur une autre page que la page d'accueil, il / elle doit être redirigé vers la page d'accueil en cliquant sur l'image d'en-tête. Comment puis je faire ça?
Joey
21

Extrait de code '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/"
//      }
SpYk3HH
la source
15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Usage:

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

C'est juste simple à utiliser
Sortie:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)
agravat.in
la source
1
ce n'est pas le meilleur moyen d'obtenir l'URL de base.
Anjani Barnwal
@AnjaniBarnwal pouvez-vous expliquer pourquoi? Je pense que c'est le meilleur moyen si vous avez une chaîne avec une URL et que vous voulez obtenir l'URL de base comme https://example.comde https://example.com/category2/page2.html?q=2#lorem-ipsum- cela n'a rien à voir avec la page actuelle sur laquelle vous vous trouvez.
OZZIE
7

Je pense que le $_SERVERsuper - mondial a les informations que vous recherchez. Cela pourrait être quelque chose comme ceci:

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

Vous pouvez voir la documentation PHP pertinente ici .

Jeremy DeGroot
la source
cela continue de rediriger vers la même page que l'utilisateur est actuellement. comment puis-je résoudre ce problème pour rediriger vers la page d'accueil? Im sur apache, localhost. php7
Joey
5

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'];
rrsantos
la source
4

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

$ _SERVER ['APP_URL'] renverra 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 / autre

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

La sortie serait comme ça

http: // localhost / répertoire / sous-répertoire / quelque chose / autre

Jijesh Cherrai
la source
1
Plutôt que de simplement coller un tas de code au hasard, expliquez ce que vous avez fait et pourquoi. De cette façon, l'OP et tous les futurs lecteurs ayant le même problème peuvent réellement apprendre quelque chose de votre réponse, plutôt que de simplement la copier / coller et de poser à nouveau la même question demain.
Oldskool
3

J'ai trouvé ça 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 uniquement le nom de la page. 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();
?>
Hoàng Vũ Tgtt
la source
2
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

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

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>
Ali
la source
2

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/

Ali Akhtar
la source
2

Vous pouvez le faire comme ça, mais désolé mon anglais n'est pas assez bon.

Tout d'abord, obtenez l'URL de base de votre domicile avec ce code simple.

J'ai testé ce code sur mon 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 aimera ceci:

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

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

utiliser la home_base_urlfonction àindex.php de votre site Web et la définir

puis vous pouvez utiliser cette fonction pour charger des scripts, des css et du 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 celle-ci:

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

et si ce script fonctionne bien ,,!

Crazy SagaXxX
la source
2
Veuillez ne pas inclure de liens vers vos sites Web dans vos réponses
ChrisF
1

En voici un que je viens de créer et qui fonctionne pour moi. Il renverra 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 dans 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;

}

Remarque: Ceci est une extension de la réponse fournie par maček ci-dessus. (Crédit là où le crédit est dû.)

Kenny
la source
1

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

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

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Badmus Taofeeq
la source
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
la source
0

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

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

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

J'espère que cela t'aides!

KAZZABE
la source
0

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 aider à créer des URL absolues à utiliser pour la redirection.

interdiction de la géo-ingénierie
la source
0
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

et vous obtenez quelque chose comme

lalala/tralala/something/
Milos Milosevic
la source
Il y a beaucoup de code sur cette entrée Q&R qui appartient à la zone de danger, celle-ci aussi surtout à cause de l'utilisation de PHP_SELF.
hakre
0

Testez simplement et obtenez 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']."/";
Anjani Barnwal
la source
0

Dans mon cas, j'avais besoin de l'URL de base similaire à celle RewriteBasecontenue dans le .htaccessfichier.

Malheureusement, il est impossible de récupérer simplement RewriteBasele .htaccessfichier à partir du fichier 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. Vérifiez simplement ces morceaux de code:

.htaccess

SetEnv BASE_PATH /

index.php

Maintenant, j'utilise ceci dans la balise de base du modèle (dans la section head 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, utilisez /le chemin de base par défaut.

En fonction de 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 mise en scène.

Ils avaient tous le leur .htaccessen premier lieu parce que la RewriteBase était différente. Donc, cette solution fonctionne pour moi.

Floris
la source
0

Jetez un œil à $ _SERVER ['REQUEST_URI'], ie

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

Si vous souhaitez prendre en charge à la fois HTTP et HTTPS, vous pouvez utiliser cette solution

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

Cela a fonctionné pour moi. J'espère que cela vous aidera également. Merci d'avoir posé cette question.

Kamlesh
la source