Как получить базовый URL с PHP?

Я использую 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

Попробуйте следующее:

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

Per этот ответ, убедитесь, что вы правильно настроили свой Apache, чтобы вы могли спокойно зависеть от SERVER_NAME.

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

ПРИМЕЧАНИЕ. Если вы зависите от ключа HTTP_HOST (который содержит вход пользователя), вам все равно нужно выполнить некоторую очистку, удалить пробелы, запятые, возврат каретки, все, что не является действительный символ для домена. Проверьте, например, функции php builtin parse_url.

Ответ 2

Функция, настроенная для выполнения без предупреждений:

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

Ответ 3

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

Использовать так же просто, как:

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

Ответ 4

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

Его просто использовать
Выход:

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

Ответ 5

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

Использование:

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

Ответ 6

Я думаю, что superglobal $_SERVER имеет информацию, которую вы ищете. Это может быть примерно так:

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

Вы можете увидеть соответствующую документацию PHP здесь.

Ответ 7

Следующий код уменьшит проблему, чтобы проверить протокол.  $ _SERVER ['APP_URL'] отобразит имя домена с протоколом

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

$_ SERVER ['REQUEST_URI'] для оставшихся частей URL-адреса, например /directory/subdirectory/something/else

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

Результат будет таким:

http://localhost/directory/subdirectory/something/else

Ответ 8

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

Во-первых, получите домашний базовый 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>

и если этот скрипт работает нормально ,!

Ответ 9

Я нашел это на 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();
?>

Ответ 10

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

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

URL-адрес выглядит следующим образом: http://example.com/folder/

Ответ 11

Попробуйте это. Это работает для меня.

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

Ответ 12

Здесь я только что собрал это для меня. Он вернет массив с 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 выше. (Кредит, в котором должен быть предоставлен кредит.)

Ответ 13

Отредактировано в @user3832931, чтобы включить серверный порт.

для формирования URL-адресов, таких как https://localhost:8000/folder/ '

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

Ответ 14

Попробуйте следующий код:

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

Ответ 15

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

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

Ответ 16

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

и вы получаете что-то вроде

lalala/tralala/something/

Ответ 17

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;

}

Ответ 18

Попробуйте использовать: $_SERVER['SERVER_NAME'];

Я использовал его, чтобы отразить базовый url моего сайта, чтобы связать мой css.

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

Надеюсь, это поможет!

Ответ 19

У меня был тот же вопрос, что и OP, но, возможно, другое требование. Я создал эту функцию...

/**
 * 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-адреса, которые должны использоваться для перенаправления.

Ответ 20

Просто проверьте и получите результат.

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

Ответ 21

В моем случае мне понадобился базовый URL-адрес, аналогичный RewriteBase содержится в файле .htaccess.

К сожалению, просто получить RewriteBase из файла .htaccess невозможно с PHP. Но можно установить переменную окружения в файле .htaccess, а затем извлечь эту переменную в PHP. Просто проверьте эти биты кода:

.htaccess

SetEnv BASE_PATH /

index.php

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

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

Исходя из среды, базовый URL будет правильным. Я использую/для моего местоположения и производственной площадки. Но /foldername/ для постановочной среды. Все они имели свой собственный .htaccess потому что RewriteBase был другим. Так что это решение работает для меня.