获取当前页面的完整URL(PHP)

9

我正在处理这个页面:http://localhost/projectname/custom.php

<?php echo $_SERVER['REQUEST_URI']; ?><?php echo $PHP_SELF; ?> 都不能返回完整的位置。你应该使用什么来获取完整的网址?

5个回答

13
function selfURL() 
{ 
    $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; 
    $protocol = strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/").$s; 
    $port = ($_SERVER["SERVER_PORT"] == "80") ? "" : (":".$_SERVER["SERVER_PORT"]); 
    return $protocol."://".$_SERVER['SERVER_NAME'].$port.$_SERVER['REQUEST_URI']; 
} 

function strleft($s1, $s2) { return substr($s1, 0, strpos($s1, $s2)); }

4
看起来来自这个网站:http://dev.kanngard.net/Permalinks/ID_20050507183447.html。 - Maxime Pacary
3
strleft 在最近版本的 PHP 中不存在。 - pr1001
pr1001 - strleft不是PHP内置函数,而是用户自定义函数。 - user8455694

9
据我所知,没有本地方法,但您可以使用以下方法: ```html

据我所知,没有本地方法,但您可以使用以下方法:

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

如果您还检查 $_SERVER["SERVER_PROTOCOL"] 以了解协议,那就更好了。 - PhoneixS
@PhoneixS 假设它是“HTTP/1.1”...我该怎么办? - Michael
@Michael,你知道协议是http,所以可以将http添加到URL中。在这个回答中,你假设所有的请求都是http,但实际上还有其他协议可以用来提供文件(例如,在使用mod_ftp的Apache服务器中可能会使用FTP协议)。 - PhoneixS
@PhoneixS 哦,好的,看起来这不是我可以直接使用的东西,即我必须将HTTP/1.1(或HTTP/1.0或其他任何内容)映射到http://,除非它可能是https://,所以我真的不知道其他可能的值可能映射到什么。无论如何,它似乎不是简单的一对一映射,需要一些解释。 - Michael
@Michael,你可以像@Sorantis的回答一样使用strleft(strtolower($_SERVER["SERVER_PROTOCOL"]), "/")来提取协议。很奇怪的是,你会看到一个服务器配置为通过除HTTP之外的其他协议提供PHP页面,因此通常可以省略此检查。我只是在评论中提到它,以防你是这些奇怪服务器之一。 - PhoneixS
我在这里缺少的是SSL端口。当连接为SSL时,如果不是443而是80,则应添加端口。 - André van Schoubroeck

3

如果您正在尝试将变量添加回通过链接跟踪脚本传递的URL末尾,您可以尝试以下方法:

$URI = array();
foreach($_GET as $key=>$val)
{
   if ($key!="link"&&$key!="id"&&$key!="type") $URI[] = "$key=".urlencode($val);
}
if (sizeof($URI)>0) $link.="&".join("&",$URI);

在这种情况下,“link”、“id”和“type”是我需要跟踪的变量,但我想要跟踪的URL末尾有一个变量,在我的脚本中被剥离了,好像它是发送给它的查询的一部分;在将其传递到header("Location:".$link)之前,我需要将其添加回链接URL中。
如果这就是你想要实现的,那么这个方法非常棒,而且比上面的示例短。

2

检查这个...有点长而且有些杂乱,但效果很好...

 function absolutizeUrl ( $u, $p )
 {
    $url = parse_url( $u );
    $page = parse_url( $p );

    if ( strpos( $u , '/' ) === 0 )
    {
            //already absolute              
    } else {
            $basePath = '';
            if (
                    isset( $page[ 'path' ] )
                    && strpos( ltrim( $page[ 'path' ], '/' ), '/' )
            )
            {
                    $baseTokens = explode( '/', $page[ 'path' ] );
                    array_pop( $baseTokens ); // strip basename                     
                    $baseTokens[] = $u;
                    $u = join( '/', $baseTokens );
            }
    }
    if ( ! isset( $url[ 'host' ]))
    {
            $u = 'http://'.$page[ 'host' ].'/'.ltrim( $u, '/' );
    }
    return $u;
  }

2
我发现这段代码非常有用。
$protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']),'https') === 
FALSE ? 'http' : 'https';            // Get protocol HTTP/HTTPS
$host     = $_SERVER['HTTP_HOST'];   // Get  www.domain.com
$script   = $_SERVER['SCRIPT_NAME']; // Get folder/file.php
$params   = $_SERVER['QUERY_STRING'];// Get Parameters occupation=odesk&name=ashik

$currentUrl = $protocol . '://' . $host . $script . '?' . $params; // Adding all

echo $currentUrl;

1
等待...即使使用https,$_SERVER['SERVER_PROTOCOL'] == "HTTP/1.1"仍然成立! - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接