Як отримати базову URL-адресу за допомогою PHP?


139

Я використовую XAMPP в Windows Vista. У своєму розвитку я маю http://127.0.0.1/test_website/.

Як мені отримати http://127.0.0.1/test_website/PHP?

Я спробував щось подібне, але жодне з них не вийшло.

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

1
Як вони не працювали? Що вони повернули?
animuson

6
@animuson Ці константи повертають локальні шляхи файлової системи, а не URL-адреси.
ceejayoz

Відповіді:


251

Спробуйте це:

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

Дізнайтеся більше про $_SERVERзаздалегідь задану змінну .

Якщо ви плануєте використовувати https, ви можете скористатися цим:

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

Відповідно до цієї відповіді , будь ласка, переконайтесь, що правильно налаштувати Apache, щоб ви могли безпечно залежати SERVER_NAME.

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

ПРИМІТКА . Якщо ви залежаєте від HTTP_HOSTключа (який містить введення користувача), вам все одно доведеться зробити очищення, видалити пробіли, коми, повернення каретки тощо. Все, що не є дійсним символом для домену. Перевірте приклад функції вбудованої PHP parse_url .


2
Слід перевірити $_SERVER['HTTPS']і замінити https://замість http://них.
ceejayoz

2
Завдяки вам мені була потрібна ця функція.
Бріс Фавр

2
як щодо $ _SERVER ['REQUEST_SCHEME']? хіба це не простіше?
frostymarvelous

2
Це не працює, якщо ви використовуєте порт, відмінний від 80. :(
M'sieur Toph '10

1
@admdrew дякую. Я двічі перевірив, що REQUEST_URIвже містить a /; це робить. @swarnendu будьте обережніші, редагуючи відповіді інших людей. Це повинен був бути замість цього коментарем.
maček

28

Функція налаштована для виконання без попереджень:

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

1
Я знав, що робив це раніше, просто не міг пригадати, як чомусь. Дякую!
Кайл Коутс

Мені потрібно встановити домашній URL на зображення заголовка. коли користувач перебуває на іншій сторінці, ніж домашня, його слід переспрямувати на головну сторінку, натиснувши на зображення заголовка. Як я можу це зробити?
Джої

21

Веселий фрагмент 'base_url'!

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

Використовуйте так само просто:

//  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/"
//      }

15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Використання:

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

13
$modifyUrl = parse_url($url);
print_r($modifyUrl)

Це просто простий у використанні
вихід:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)

1
це не найкращий спосіб отримати базовий URL.
Анджані Барнваль

@AnjaniBarnwal Ви можете пояснити, чому? Я думаю, що це найкращий спосіб, якщо у вас є рядок з URL-адресою і хочете отримати базовий URL-адресу, як- https://example.comот https://example.com/category2/page2.html?q=2#lorem-ipsum- це не має нічого спільного з поточною сторінкою, на якій ви перебуваєте.
OZZIE

7

Я думаю, що у $_SERVERсуперглобалу є інформація, яку ви шукаєте. Це може бути щось подібне:

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

Ви можете ознайомитись з відповідною документацією PHP тут .


це продовжує переадресацію до тієї самої сторінки, на якій зараз користувач. як я можу це виправити для переадресації на головну сторінку? Я на апачі, локальний господар. php7
Joey

5

Спробуйте наступний код:

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

4

Наступний код зменшить проблему для перевірки протоколу. $ _SERVER ['APP_URL'] відображатиме доменне ім’я разом із протоколом

$ _SERVER ['APP_URL'] поверне протокол: // домен (наприклад: - http: // localhost )

$ _SERVER ['REQUEST_URI'] для інших частин URL-адреси, таких як / каталог / підкаталог / щось / ще

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

Вихід був би таким

http: // localhost / каталог / підкаталог / щось / інше


1
Замість того, щоб просто вставити випадкову купу коду, поясніть, що ви зробили і чому. Таким чином, ОП та будь-які майбутні читачі з тією ж проблемою можуть насправді дізнатися щось із вашої відповіді, а не просто скопіювати / вставити її та задати те саме питання завтра.
Oldskool

3

Я знайшов це на http://webcheatsheet.com/php/get_current_page_url.php

Додайте такий код на сторінку:

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

Тепер ви можете отримати URL-адресу поточної сторінки за допомогою рядка:

<?php
  echo curPageURL();
?>

Іноді це потрібно лише для отримання назви сторінки. Наступний приклад показує, як це зробити:

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

echo "The current page name is ".curPageName();
?>

2
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

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

2

Спробуйте це. Це працює для мене.

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

Використовуйте так:

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

Простий і легкий трюк:

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

URL-адреса виглядає приблизно так: http://example.com/folder/


2

Ви можете це зробити так, але вибачте, моя англійська мова недостатньо хороша.

По-перше, отримайте домашню базову URL-адресу з цим простим кодом.

Я перевірив цей код на своєму локальному сервері та в громадських місцях, і результат хороший.

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

вихід сподобається так:

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

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

використовуйте home_base_urlфункцію index.phpвашого веб-сайту та визначте її

а потім ви можете скористатися цією функцією для завантаження скриптів, css та вмісту за допомогою URL-адреси

<?php

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

?>

створить вихід таким чином:

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

і якщо цей сценарій працює добре ,,!


2
Будь ласка, не включайте у свої відповіді посилання на веб-сайти
ChrisF

1

Ось я тільки що зібрав, що працює для мене. Він поверне масив з 2 елементами. Перший елемент - все до? другий - це масив, що містить усі змінні рядки запиту в асоціативному масиві.

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;

}

Примітка. Це розширення відповіді, наданої maček вище. (Кредит, якщо належить кредит.)


1

Відредаговано у відповіді @ user3832931, щоб включити порт сервера.

сформувати такі URL-адреси, як " https: // localhost: 8000 / folder / "

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

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;

}

0

Спробуйте скористатися: $_SERVER['SERVER_NAME'];

Я використовував це, щоб відлучити базовий URL-адресу свого сайту, щоб пов’язати свій css.

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

Сподіваюся, це допомагає!


0

У мене було те саме питання, що і до ОП, але, можливо, інша вимога. Я створив цю функцію ...

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

}

... що, до речі, я використовую для створення абсолютних URL-адрес, які слід використовувати для переадресації.


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

і ти отримуєш щось подібне

lalala/tralala/something/

У цьому запиті з питань запитання є багато коду, який належить до небезпечної зони, цей, особливо через використання PHP_SELF.
хакре

0

Просто протестуйте і отримайте результат.

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

У моєму випадку мені потрібна була основна URL-адреса, аналогічна наведеній RewriteBaseу.htaccess файлі.

На жаль, просто отримати PHP RewriteBaseз .htaccessфайлу неможливо. Але можна встановити змінну середовища у файлі .htaccess, а потім отримати цю змінну в PHP. Просто перевірте ці біти коду:

.htaccess

SetEnv BASE_PATH /

index.php

Тепер я використовую це в базовому тезі шаблону (у головному розділі сторінки):

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

Отже, якщо змінна не була порожньою, ми її використовуємо. В іншому випадку повернення до /базового шляху за замовчуванням.

Виходячи з оточення, базовий URL завжди буде правильним. Я використовую /як базовий URL на локальних і виробничих веб-сайтах. Але /foldername/для постановочного середовища.

У всіх їх було .htaccessв першу чергу, тому що RewriteBase був іншим. Тож це рішення працює для мене.


0

Подивіться на $ _SERVER ['REQUEST_URI'], тобто

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

Якщо ви хочете підтримувати і HTTP, і HTTPS, ви можете використовувати це рішення

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

Це працювало для мене. Сподіваюся, це теж допоможе вам. Дякуємо, що задали це запитання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.