978 votos

Obtener la dirección URL completa en PHP

Usar este código para obtener la dirección URL completa:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

El problema es que utilizo algunas máscaras en mi .htaccess , por lo que vemos en la URL no es siempre el camino real del archivo.

Lo que necesito es conseguir la URL, lo que está escrito en la dirección URL, nada más y nada menos, el URL completo.

Necesito como aparece en la barra de navegación en el navegador web y no la verdadera ruta del archivo en el servidor.

1931voto

ax. Puntos 22269

Echa un vistazo a $_SERVER['REQUEST_URI'] , es decir,

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

(Tenga en cuenta que la sintaxis de doble cadena entrecomillada es perfectamente correcto)

Nota del editor: utilizando este código tiene implicaciones de seguridad. El cliente puede configurar HTTP_HOST cualquier valor arbitrario que quiere.

406voto

Timo Huovinen Puntos 8283

Versión corta para la salida de enlace en una página web

$link =  "//$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$escaped_link = htmlspecialchars($link, ENT_QUOTES, 'UTF-8');
echo '<a href="'.$escaped_link.'">'.$escaped_link.'</a>';

Aquí hay algunos detalles más acerca de los problemas y casos de borde de la //example.com/path/ formato

Versión completa

function url_origin($s, $use_forwarded_host=false)
{
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = ($use_forwarded_host && isset($s['HTTP_X_FORWARDED_HOST'])) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);
    $host = isset($host) ? $host : $s['SERVER_NAME'] . $port;
    return $protocol . '://' . $host;
}
function full_url($s, $use_forwarded_host=false)
{
    return url_origin($s, $use_forwarded_host) . $s['REQUEST_URI'];
}
$absolute_url = full_url($_SERVER);
echo $absolute_url;

Esta es una versión muy modificada de http://snipplr.com/view.php?codeview&id=2734.

La estructura de la URL:

esquema://username:password@dominio:puerto/ruta?query_string#fragment_id

Las partes en negrita no serán incluidos por la función

Notas:

  • Esta función no incluyen username:password a partir de una dirección URL completa o el fragmento de (hash).
  • No se mostrará el valor predeterminado es el puerto 80 para HTTP y el puerto 443 para HTTPS.
  • Sólo probado con http y https esquemas.
  • La #fragment_id no se envía al servidor por el cliente (navegador) y no se añadirán a la dirección URL completa.
  • $_GET sólo contendrá foo=bar2 para una dirección URL como /example?foo=bar1&foo=bar2.
  • Algunos de la CMS y de los entornos de reescribir $_SERVER['REQUEST_URI'] y devolver /example?foo=bar2 para una dirección URL como /example?foo=bar1&foo=bar2, uso $_SERVER['QUERY_STRING'] en este caso.
  • Tenga en cuenta que una URI = URL + URN, pero debido al uso popular, URL, lo que significa tanto de URI y URL.
  • Usted debe remover HTTP_X_FORWARDED_HOST si no va a utilizar proxies o equilibradores.
  • La especificación dice que el Host de encabezado debe contener el número de puerto a menos que sea el número predeterminado.

Cliente (Navegador) variables controladas:

  • $_SERVER['REQUEST_URI']. Cualquiera de los caracteres no admitidos son codificadas por el navegador antes de que sean enviados.
  • $_SERVER['HTTP_HOST'] y no está siempre disponible, de acuerdo a los comentarios en el manual de PHP: http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST'] se establece por balanceadores y no es mencionado en la lista de $_SERVER variables en el manual de PHP.

Servidor de variables controladas:

  • $_SERVER['HTTPS']. El cliente elige a usar esto, pero el servidor devuelve el valor real de vacío o "en".
  • $_SERVER['SERVER_PORT']. El servidor solo acepta números permitidos como los puertos.
  • $_SERVER['SERVER_PROTOCOL']. El servidor solo acepta ciertos protocolos.
  • $_SERVER['SERVER_NAME'] . Es establecer manualmente en la configuración del servidor y no está disponible para IPv6 según kralyk.

Relacionado:

HTTP_HOST vs. SERVER_NAME
Es el Número de Puerto se Requiere en HTTP "Host" Parámetro de Cabecera?

138voto

Chen Asraf Puntos 5529

De hecho, sólo echar un vistazo a la serie entera con print_r($_SERVER) , usted verá todo lo que necesitas :)

62voto

honyovk Puntos 1398

Una forma es:

$url = "http" . (($_SERVER['SERVER_PORT']==443) ? "s://" : "://") . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Este es el más pequeña y más fácil manera de hacer esto, asumiendo que el servidor web está utilizando el puerto estándar 443 para HTTPS.

20voto

function full_path()
{
    $s = &$_SERVER;
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = isset($s['HTTP_X_FORWARDED_HOST']) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);
    $host = isset($host) ? $host : $s['SERVER_NAME'] . $port;
    $uri = $protocol . '://' . $host . $s['REQUEST_URI'];
    $segments = explode('?', $uri, 2);
    $url = $segments[0];
    return $url;
}

Nota: Acabo de hacer una actualización al código "de Timo Huovinen", así que no tendrás ninguna se pone en la URL. Esta dirección URL es llana y quita cosas como "? Hola = i & am = un & get".

Ejemplo:

http://www.website.com/index?get=information

se mostrará como:

http://www.website.com/index

Si no utilizas se pone a definir algún contenido específico, entonces usa su código! :-)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X