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

获取当前页面的完整URL(PHP),php,scripting,path,location,Php,Scripting,Path,Location,我正在处理这个页面:http://localhost/projectname/custom.php 和都没有给出完整的位置。我应该使用什么来获取完整的url位置?据我所知,没有本机方法,但您可以使用以下方法: function selfURL() { $s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : ""; $protocol = strleft(strtolower($_SER

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


都没有给出完整的位置。我应该使用什么来获取完整的url位置?

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

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

检查一下这个。。。有点长,有点脏,但效果很好

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

例如,如果试图将变量添加回通过链接跟踪脚本传递的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末尾有一个变量,该变量被我的脚本剥离,就好像它是发送给它的查询的一部分一样;我需要将它添加回链接URL,然后再将其传递到标题(“位置:”.$link)


如果这是您试图实现的目标,那么该代码非常有效,并且比上面的示例更短。

我发现该代码非常有用

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

似乎来自该网站:
strleft
不存在(至少在最新版本的PHP中是如此)。pr1001-strleft不是PHP中内置的函数,而是用户制作的函数如果您还检查
$\u SERVER[“SERVER\u PROTOCOL”]
了解该协议,它可能会很好。@phoneix假设它是“HTTP/1.1”。。。我该怎么办?@Michael你知道协议是http,所以你可以将http添加到url中。在这个回答中,您假设所有请求都是http,但也可以使用其他协议来为文件提供服务(例如,在带有mod_ftp的apache服务器中,我认为它可以是ftp)。@PhoneixS Ah ok,这似乎不是我可以直接使用的东西,即我必须将http/1.1(或http/1.0或其他任何协议)映射到http://,除了它可能是https://之外,所以我真的不知道其他可能的值可能映射到什么。不管怎么说,它似乎不是一个简单的1:1映射,需要一些解释。@Michael您可以像@Sorantis answer
strleft(strtolower($\u SERVER[“SERVER\u PROTOCOL”]),“/”
一样提取协议。非常奇怪的是,您会看到一个服务器被配置为通过http以外的其他协议为php页面提供服务,所以通常省略此检查是很安全的。我只是在你是一个奇怪的服务器的情况下才评论它。等等$_服务器['SERVER_PROTOCOL']==“HTTP/1.1”,即使在使用https时也是如此!