2010-02-10 252 views
8

我正在此頁面上的完整URL:http://localhost/projectname/custom.php獲取當前頁面(PHP)

兩個<?php echo $_SERVER['REQUEST_URI']; ?><?php echo $PHP_SELF; ?>不充分的位置。我應該使用什麼來獲取完整的url位置?

回答

11
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 – 2011-08-04 14:04:38

+3

'strleft'不存在(至少在最近PHP版本)。 – pr1001 2013-10-09 11:46:27

+0

pr1001 - strleft不是在php中的函數中構建的,但是用戶自定義的函數 – user8455694 2018-02-16 03:29:40

8

沒有一個本地方法,據我知道,但你可以這樣做:

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

如果您也檢查'$ _SERVER [「SERVER_PROTOCOL」]來了解協議,那可能會很好。 – PhoneixS 2014-05-14 07:13:26

+0

@PhoneixS假設它是「HTTP/1.1」...我該怎麼做? – Michael 2014-12-10 03:05:14

+0

@Michael你知道協議是http,所以你可以添加http到url。在這個答案中,你認爲所有的請求都是http,但可能有其他協議來爲這些文件提供服務(例如,在mod_ftp的apache服務器中,我認爲它可以是ftp)。 – PhoneixS 2014-12-11 09:20:19

1

檢查這個......有點長,但髒良好的工作...

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

如果你正試圖重新添加變量到你正在經歷一個鏈接跟蹤腳本的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,然後將它傳遞給標題(「Location:」。$ link)。

如果這是你正在努力實現這個偉大的作品,並比上面的例子短。

1

我發現這個代碼非常有幫助

$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

等待... $ _SERVER ['SERVER_PROTOCOL'] ==「HTTP/1.1」,即使使用https! – Michael 2014-12-10 03:04:20