php - PHP获取完整的URL

  显示原文与译文双语对照的内容

我使用这里代码获取完整的URL:


$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

问题是我在 .htaccess 中使用了一些掩码,所以我们在URL中看到的并不总是文件的真实路径。

我需要的是获取 URL,在URL中写什么,没有less—the完整的URL 。

我需要获取它如何显示在浏览器的导航栏中,而不是服务器上文件的真实路径。

时间:

看看 $_SERVER['REQUEST_URI'],i.e.


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

( 注意双引号的字符串语法是完全正确的语法)

编辑注:使用这段代码安全的影响。 客户端可以将HTTP_HOST设置为任意任意的值。

下面是使用三元语句的解决方案,保持代码的最小:


$url ="http". (($_SERVER['SERVER_PORT'] == 443)?"s://" :"://"). $_SERVER['HTTP_HOST']. $_SERVER['REQUEST_URI'];

这是最简单和最简单的方法,假设一台服务器的站点正在使用标准端口 443 HTTPS

我最喜欢的用于查找当前URL的跨平台方法是:


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


function full_path()
{
 $s = &$_SERVER;
 $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on')? true:false;
 $sp = strtolower($s['SERVER_PROTOCOL']);
 $protocol = substr($sp, 0, strpos($sp, '/')). (($ssl)? 's' : '');
 $port = $s['SERVER_PORT'];
 $port = ((!$ssl && $port=='80') || ($ssl && $port=='443'))? '' : ':'.$port;
 $host = isset($s['HTTP_X_FORWARDED_HOST'])? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST'])? $s['HTTP_HOST'] : null);
 $host = isset($host)? $host : $s['SERVER_NAME']. $port;
 $uri = $protocol. '://'. $host. $s['REQUEST_URI'];
 $segments = explode('?', $uri, 2);
 $url = $segments[0];
 return $url;
}

注意你刚刚有了一个更新来的huovinen"Timo"代码,因此你将不会得到任何的获取到的网址。 这里URL是普通的,并删除像"?hi=i&am=a&get 这样的东西"。

例如:


http://www.website.com/index?get=information

将显示为:


http://www.website.com/index

除非你使用get定义一些特定的内容,然后使用他的代码 ! :- )

这是我的灵感来自于解决方案- 代码崔西调试器 。 它被更改为支持不同的服务器端口。 你可以获得完整的当前 URL,包括 $_SERVER['REQUEST_URI'] 或者基本服务器 URL 。 检查我的函数:


function getCurrentUrl($full = true) {
 if (isset($_SERVER['REQUEST_URI'])) {
 $parse = parse_url(
 (isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off')? 'https://' : 'http://'). 
 (isset($_SERVER['HTTP_HOST'])? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME'])? $_SERVER['SERVER_NAME'] : '')). (($full)? $_SERVER['REQUEST_URI'] : null)
 );
 $parse['port'] = $_SERVER["SERVER_PORT"];//Setup protocol for sure (80 is default)
 return http_build_url('', $parse);
 }
}

下面是测试代码:


//Follow $_SERVER variables was set only for test
$_SERVER['HTTPS'] = 'off';//on
$_SERVER['SERVER_PORT'] = '9999';//Setup
$_SERVER['HTTP_HOST'] = 'some.crazy.server.5.name:8088';//Port is optional there
$_SERVER['REQUEST_URI'] = '/150/tail/single/normal?get=param';

echo getCurrentUrl();
//http://some.crazy.server.5.name:9999/150/tail/single/normal?get=param

echo getCurrentUrl(false);
//http://some.crazy.server.5.name:9999/

接受的答案相同,但使用 HTTPS 支持,更易读:


$current_url = sprintf(
 '%s://%s/%s',
 isset($_SERVER['HTTPS'])? 'https' : 'http',
 $_SERVER['HTTP_HOST'],
 $_SERVER['REQUEST_URI']
);

oneliner如何查找父文件夹 url ( 如果你没有访问 http_build_url()的访问权限):


$url = (isset($_SERVER['HTTPS'])? 'http://' : 'https://').$_SERVER['SERVER_NAME'].str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(dirname(__FILE__)));

...