如何用PHP获取基本URL?

时间:2010-05-12 16:18:51

标签: php

我在Windows Vista上使用XAMPP。在我的开发中,我有http://127.0.0.1/test_website/

如何使用PHP获取http://127.0.0.1/test_website/

我尝试过类似的东西,但都没有。

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

24 个答案:

答案 0 :(得分:232)

试试这个:

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

详细了解$_SERVER Predefined Variable

如果您打算使用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

this answer,请确保正确配置您的Apache,以便您可以安全地依赖SERVER_NAME

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

注意:如果你依赖HTTP_HOST键(包含用户输入),你仍然需要进行一些清理,删除空格,逗号,回车,任何东西都是不是域的有效字符。例如,检查php builtin parse_url函数。

答案 1 :(得分:25)

调整功能以在没有警告的情况下执行:

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

答案 2 :(得分:19)

有趣的'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/"
//      }

答案 3 :(得分:13)

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

它的使用简单
输出:

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

答案 4 :(得分:11)

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

用法:

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

答案 5 :(得分:5)

我认为$_SERVER超全球拥有您正在寻找的信息。它可能是这样的:

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

您可以看到相关的PHP文档here

答案 6 :(得分:3)

以下代码将减少检查协议的问题。  $ _SERVER ['APP_URL']将显示带有协议的域名

$ _ SERVER ['APP_URL']将返回 protocol:// domain (例如: - http://localhost

$ _ SERVER ['REQUEST_URI']用于网址的其余部分,例如 / directory / subdirectory / something / else

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

输出就像这样

<强> http://localhost/directory/subdirectory/something/else

答案 7 :(得分:2)

我发现了这个 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;
}
?>

您现在可以使用以下行获取当前页面网址:

<?php
  echo curPageURL();
?>

有时需要获取页面名称。以下示例显示了如何执行此操作:

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

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

答案 8 :(得分:2)

简单易行的技巧:

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

网址如下所示:http://example.com/folder/

答案 9 :(得分:2)

你可以这样做,但抱歉我的英语不够好。

首先,使用这个简单的代码获取home base 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功能并定义

然后你可以使用这个函数通过url加载脚本,css和内容,如

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

如果这个脚本工作正常,那么!

答案 10 :(得分: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>

答案 11 :(得分: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提供的答案的扩展。 (信用到期的信用。)

答案 12 :(得分:1)

编辑@ user3832931的答案,包括服务器端口..

以形成类似&#39; https://localhost:8000/folder/&#39;

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

答案 13 :(得分:1)

尝试以下代码:

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

答案 14 :(得分:0)

$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";
$dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '',$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']);
echo $url = $http . $dir;
// echo $url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];

答案 15 :(得分:0)

这是我认为最好的方法。

$base_url = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "off") ? "https" : "http");
$base_url .= "://".$_SERVER['HTTP_HOST'];
$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);

echo $base_url;

答案 16 :(得分: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]";

这对我有用。希望对您有帮助。感谢您提出这个问题。

答案 17 :(得分:0)

就我而言,我需要类似于RewriteBase文件中包含的.htaccess的基本URL。

不幸的是,使用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/用于登台环境。

由于RewriteBase有所不同,因此它们最初都有自己的.htaccess。所以这个解决方案对我有用。

答案 18 :(得分: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']."/";

答案 19 :(得分:0)

我有与OP相同的问题,但可能有不同的要求。我创建了这个函数......

import { NativeStorage } from '@ionic-native/native-storage';

function constructor(public userId: String){ }


//and the factory function
//don't know how exactly how to export stuff in that framework
function createById(userId){
    return NativeStorage.getItem('userId')
        .then(
            userId => new YourClass(userId)
            error => console.error(error)
        )
}

...顺便提一句,我用它来帮助创建应该用于重定向的绝对URL。

答案 20 :(得分:0)

尝试使用:$_SERVER['SERVER_NAME'];

我用它来回显我网站的基本网址以链接我的CSS。

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

希望这有帮助!

答案 21 :(得分:0)

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

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

答案 22 :(得分: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;

}

答案 23 :(得分:0)

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

你得到了     

之类的东西
lalala/tralala/something/