2010-02-10 21 views
8

pracuję na tej stronie: http://localhost/projectname/custom.phpGetting pełny adres URL bieżącej strony (PHP)

Zarówno <?php echo $_SERVER['REQUEST_URI']; ?> i <?php echo $PHP_SELF; ?> nie dają pełną lokalizację. Co powinienem użyć, aby pobrać pełną lokalizację adresu URL?

Odpowiedz

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

wydaje pochodzących z tej strony: http://dev.kanngard.net/Permalinks/ID_20050507183447.html –

+3

'strleft' nie istnieje (przynajmniej w ostatnich wersje PHP). – pr1001

+0

pr1001 - strleft nie jest wbudowany w php, ale funkcja stworzona przez użytkownika – user8455694

8

Nie jest rodowitym metoda, o ile mi wiadomo, ale można użyć to:

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

Może być dobrze, jeśli sprawdzisz również '$ _SERVER [" SERVER_PROTOCOL "]', aby poznać protokół. – PhoneixS

+0

@PhoneixS Załóżmy, że jest to "HTTP/1.1" ... co mam z tym zrobić? – Michael

+0

@Michael wiesz, że protokół to http, więc możesz dodać http do adresu URL. W tej odpowiedzi zakładałeś, że wszystkie żądania są http, ale możliwe jest posiadanie innych protokołów do obsługi plików (na przykład na serwerze apache z mod_ftp myślę, że może to być ftp). – PhoneixS

1

sprawdzić ten ... trochę długie i brudne, ale działa dobrze ...

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

Jeśli próbujesz dodać zmienne powrotem na końcu adresu URL, że jesteś przechodzącej przez skrypt śledzenia łącza, na przykład, można spróbować to:

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

W tym przypadku "link", "id" i "typ" były zmiennymi, których potrzebowałem do śledzenia, ale adres URL, który chciałem śledzić, miał zmienną na końcu, która została usunięta przez moje skrypt tak, jakby był częścią wysyłanego do niego zapytania; Potrzebowałem dodać go z powrotem do adresu URL linku przed przekazaniem go do nagłówka ("Location:". $ Link).

Jeśli to, co próbujesz osiągnąć, działa świetnie i jest krótsze niż w powyższym przykładzie.

1

znalazłem ten kod bardzo pomocny

$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

czekać ... $ _SERVER ['SERVER_PROTOCOL'] == "HTTP/1.1" nawet przy użyciu https! – Michael

Powiązane problemy