如何使用 PHP 获得基 URL?

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

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

我试过类似的方法,但都不管用。

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
701238 次浏览

试试这个:

<?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函数。

我认为 $_SERVER超级全球机器人拥有你想要的信息,它可能是这样的:

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

您可以看到相关的 PHP 文档 给你

功能调整执行无警告:

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

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

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

首先,使用这个简单的代码获得 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/

在你的网站的 index.php使用 home_base_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>

如果这个脚本运行良好,!

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


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

用法:

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

我发现了这个 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();
?>
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

然后你就得到了 比如

lalala/tralala/something/
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;


}

这是我刚整理出来的适合我的。它将返回一个包含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;


}

注意: 这是对上面提供的答案的扩展

简单的小把戏:

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

URL 看起来像这样: http://example.com/folder/

下面的代码将减少检查协议的问题。 $_ SERVER [‘ APP _ URL’]将显示带协议的域名

$_ SERVER [‘ APP _ URL’]将返回 协议://域(例如:-http://localhost)

$_ SERVER [‘ REQUEST _ URI’]用于 URL 的其余部分,如 /目录/子目录/something/else

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

输出应该是这样的

Http://localhost/directory/subdirectory/something/else

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

用起来很简单
输出: < br/>

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

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

形成像“ https://localhost:8000/folder/”这样的 URL

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

试试这个,对我有用。

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

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

我使用它来回显我的网站的基本网址来链接我的 css。

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

希望这个能帮上忙!

我有同样的问题作为 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。

测试一下就知道结果了。

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

尝试以下代码:

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

第一行是检查基本 URL 是使用 http 还是 https,然后第二行是用来获取主机名。然后第三行用来获取网站 ex 的基本文件夹。/test _ site/

在我的例子中,我需要类似于 .htaccess文件中包含的 RewriteBase的基 URL。

不幸的是,仅仅从 .htaccess文件中检索 RewriteBase对 PHP 来说是不可能的。设定环境变量。Htaccess 文件,然后在 PHP 中检索该变量。检查一下这些代码:

. htaccess

SetEnv BASE_PATH /

Index.php

现在,我在模板的基本标记(页面的头部分)中使用它:

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

因此,如果变量不是空的,我们使用它。否则回退到 /作为默认的基本路径。

基于环境,基本 URL 始终是正确的。我使用 /作为本地和生产网站的基本网址。但是 /foldername/对于集结环境来说。

首先,它们都有自己的 .htaccess,因为 RewriteBase 是不同的。所以这个解决方案对我有效。

我认为这是最好的方法。

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

即使当前 URL 具有请求查询字符串,下面的解决方案也可以工作。

<?php


function baseUrl($file=__FILE__){
$currentFile = array_reverse(explode(DIRECTORY_SEPARATOR,$file))[0];
if(!empty($_SERVER['QUERY_STRING'])){
$currentFile.='?'.$_SERVER['QUERY_STRING'];
}
$protocol = $_SERVER['PROTOCOL'] == isset($_SERVER['HTTPS']) &&
!empty($_SERVER['HTTPS']) ? 'https' : 'http';
$url = "$protocol://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$url = str_replace($currentFile, '', $url);


return $url;
}

调用文件将提供 __FILE__作为参数

<?= baseUrl(__FILE__)?>