2010-02-10 31 views
8

estoy trabajando en esta página: http://localhost/projectname/custom.phpObtener la URL completa de la página actual (PHP)

Tanto <?php echo $_SERVER['REQUEST_URI']; ?> y <?php echo $PHP_SELF; ?> no dan lugar lleno. ¿Qué debería usar para tomar la ubicación completa de la url?

Respuesta

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

Parece que viene de ese sitio: http://dev.kanngard.net/Permalinks/ID_20050507183447.html –

+3

'no existe strleft' (al menos en los últimos versiones de PHP). – pr1001

+0

pr1001 - strleft no está incorporado en la función en php, sino función creada por el usuario – user8455694

8

no hay un método nativo por lo que yo sé, pero se puede usar esto:

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

Podría ser bueno si también verifica '$ _SERVER [" SERVER_PROTOCOL "]' para conocer el protocolo. – PhoneixS

+0

@PhoneixS Supongamos que es "HTTP/1.1" ... ¿qué hago con eso? – Michael

+0

@Michael, usted sabe que el protocolo es http, por lo que puede agregar http a la url. En esta respuesta asumió que todas las solicitudes son http, pero es posible tener otros protocolos para servir los archivos (por ejemplo, en un servidor apache con mod_ftp, creo que puede ser ftp). – PhoneixS

1

cheque éste ... un poco larga y sucia, pero funciona bien ...

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

Si está intentando agregar las variables de nuevo en el final de una dirección URL que está de paso en una secuencia de comandos de seguimiento de enlace, por ejemplo, usted podría intentar esto:

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

En este caso, las variables que necesitaba para el seguimiento eran "enlace", "id" y "tipo", pero la URL que quería rastrear tenía una variable al final que se eliminó por mi secuencia de comandos como si fuera parte de la consulta que se le envía; Necesitaba agregarlo a la URL del enlace antes de pasarlo a la cabecera ("Ubicación:". $ Link).

Si esto es lo que está tratando de lograr, este funciona bien y es más corto que el ejemplo anterior.

1

encontré este código muy útil

$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

espere ... $ _SERVER ['SERVER_PROTOCOL'] == "HTTP/1.1" incluso cuando se utiliza https! – Michael

Cuestiones relacionadas