¿Cómo obtengo la URL base con PHP?

139

Estoy usando XAMPP en Windows Vista. En mi desarrollo, tengo http://127.0.0.1/test_website/.

¿Cómo consigo http://127.0.0.1/test_website/con PHP?

Intenté algo como esto, pero ninguno de ellos funcionó.

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
espinilla
fuente
1
¿Cómo no funcionaron? ¿Qué regresaron?
animuson
66
@animuson Esas constantes devuelven rutas locales del sistema de archivos, no URL.
ceejayoz
posible duplicado de Obtener la URL completa en PHP
T.Todua

Respuestas:

251

Prueba esto:

<?php echo "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; ?>

Obtenga más información sobre la $_SERVERvariable predefinida .

Si planea usar https, puede usar esto:

function url(){
  return sprintf(
    "%s://%s%s",
    isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
    $_SERVER['SERVER_NAME'],
    $_SERVER['REQUEST_URI']
  );
}

echo url();
#=> http://127.0.0.1/foo

Según esta respuesta , asegúrese de configurar su Apache correctamente para que pueda confiar de manera segura SERVER_NAME.

<VirtualHost *>
    ServerName example.com
    UseCanonicalName on
</VirtualHost>

NOTA : Si depende de la HTTP_HOSTclave (que contiene la entrada del usuario), aún debe realizar algunas tareas de limpieza, eliminar espacios, comas, retorno de carro, etc. Cualquier cosa que no sea un carácter válido para un dominio. Verifique la función incorporada PHP parse_url para ver un ejemplo.

maček
fuente
2
Debería registrarse $_SERVER['HTTPS']e intercambiar en https://lugar de http://en esos casos.
ceejayoz
2
Gracias a ti, necesitaba esta función.
Brice Favre
2
¿Qué pasa con $ _SERVER ['REQUEST_SCHEME']? ¿No es eso más simple?
frostymarvelous
2
Esto no funciona si está utilizando un puerto diferente de 80. :(
M'sieur Toph '10 de
1
@admdrew gracias. Verifiqué dos veces que REQUEST_URIya incluye un /; lo hace. @swarnendu , tenga más cuidado al editar las respuestas de otras personas. Eso debería haber sido un comentario en su lugar.
maček
28

Función ajustada para ejecutarse sin advertencias:

function url(){
    if(isset($_SERVER['HTTPS'])){
        $protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] != "off") ? "https" : "http";
    }
    else{
        $protocol = 'http';
    }
    return $protocol . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
}
ftrotter
fuente
1
Sabía que había hecho esto antes, pero no podía recordar cómo por alguna razón. ¡Gracias!
Kyle Coots
Necesito configurar la URL de inicio en la imagen del encabezado. cuando el usuario está en otra página que no sea la de inicio, debe ser redirigido a la página de inicio haciendo clic en la imagen del encabezado. ¿Cómo puedo hacer eso?
Joey
21

¡Divertido fragmento 'base_url'!

if (!function_exists('base_url')) {
    function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
        if (isset($_SERVER['HTTP_HOST'])) {
            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
            $core = $core[0];

            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
            $base_url = sprintf( $tmplt, $http, $hostname, $end );
        }
        else $base_url = 'http://localhost/';

        if ($parse) {
            $base_url = parse_url($base_url);
            if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
        }

        return $base_url;
    }
}

Use tan simple como:

//  url like: http://stackoverflow.com/questions/2820723/how-to-get-base-url-with-php

echo base_url();    //  will produce something like: http://stackoverflow.com/questions/2820723/
echo base_url(TRUE);    //  will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE);    //  will produce something like: http://stackoverflow.com/questions/
//  and finally
echo base_url(NULL, NULL, TRUE);
//  will produce something like: 
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/2820723/"
//      }
SpYk3HH
fuente
15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Uso:

print "<script src='{$base_url}js/jquery.min.js'/>";
usuario3832931
fuente
13
$modifyUrl = parse_url($url);
print_r($modifyUrl)

Es simple de usar
Salida:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)
agravat.in
fuente
1
No es la mejor manera de obtener la URL base.
Anjani Barnwal
@AnjaniBarnwal, ¿puedes explicar por qué? Creo que esta es la mejor manera si usted tiene una cadena con una url y desea obtener la url base como https://example.comde https://example.com/category2/page2.html?q=2#lorem-ipsum- que no tiene nada que ver con la página actual que se encuentra.
OZZIE
7

Creo que el $_SERVERsuperglobal tiene la información que estás buscando. Puede ser algo como esto:

echo $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']

Puede ver la documentación PHP relevante aquí .

Jeremy DeGroot
fuente
esto sigue redirigiendo a la misma página que el usuario está en este momento. ¿Cómo puedo solucionar esto para redirigir a la página de inicio? Estoy en apache, localhost. php7
Joey
5

Prueba el siguiente código:

$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
$config['base_url'] .= "://".$_SERVER['HTTP_HOST'];
$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']);
echo $config['base_url'];
rrsantos
fuente
4

El siguiente código reducirá el problema para verificar el protocolo. $ _SERVER ['APP_URL'] mostrará el nombre de dominio con el protocolo

$ _SERVER ['APP_URL'] devolverá el protocolo: // dominio (por ejemplo: - http: // localhost )

$ _SERVER ['REQUEST_URI'] para las partes restantes de la URL, como / directorio / subdirectorio / algo / más

 $url = $_SERVER['APP_URL'].$_SERVER['REQUEST_URI'];

La salida sería así

http: // localhost / directorio / subdirectorio / algo / más

Jijesh Cherrai
fuente
1
En lugar de simplemente pegar un grupo aleatorio de código, explique lo que hizo y por qué. De esa forma, el OP y cualquier lector futuro con el mismo problema pueden aprender algo de su respuesta, en lugar de simplemente copiarlo / pegarlo y hacer la misma pregunta nuevamente mañana.
Oldskool
3

Encontré esto en http://webcheatsheet.com/php/get_current_page_url.php

Agregue el siguiente código a una página:

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

Ahora puede obtener la URL de la página actual usando la línea:

<?php
  echo curPageURL();
?>

A veces es necesario obtener solo el nombre de la página. El siguiente ejemplo muestra cómo hacerlo:

<?php
function curPageName() {
 return substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
}

echo "The current page name is ".curPageName();
?>
Hoàng Vũ Tgtt
fuente
2
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

$url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];
Farid Bangash
fuente
2

Prueba esto. Esto funciona para mi.

/*url.php file*/

trait URL {
    private $url = '';
    private $current_url = '';
    public $get = '';

    function __construct()
    {
        $this->url = $_SERVER['SERVER_NAME'];
        $this->current_url = $_SERVER['REQUEST_URI'];

        $clean_server = str_replace('', $this->url, $this->current_url);
        $clean_server = explode('/', $clean_server);

        $this->get = array('base_url' => "/".$clean_server[1]);
    }
}

Usar así:

<?php
/*
Test file

Tested for links:

http://localhost/index.php
http://localhost/
http://localhost/index.php/
http://localhost/url/index.php    
http://localhost/url/index.php/  
http://localhost/url/ab
http://localhost/url/ab/c
*/

require_once 'sys/url.php';

class Home
{
    use URL;
}

$h = new Home();

?>

<a href="<?=$h->get['base_url']?>">Base</a>
Ali
fuente
2

Truco simple y fácil:

$host  = $_SERVER['HTTP_HOST'];
$host_upper = strtoupper($host);
$path   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$baseurl = "http://" . $host . $path . "/";

La URL se ve así: http://example.com/folder/

Ali Akhtar
fuente
2

Puedes hacerlo así, pero lo siento, mi inglés no es lo suficientemente bueno.

Primero, obtenga la URL de la base de inicio con este código simple.

He probado este código en mi servidor local y público y el resultado es bueno.

<?php

function home_base_url(){   

// first get http protocol if http or https

$base_url = (isset($_SERVER['HTTPS']) &&

$_SERVER['HTTPS']!='off') ? 'https://' : 'http://';

// get default website root directory

$tmpURL = dirname(__FILE__);

// when use dirname(__FILE__) will return value like this "C:\xampp\htdocs\my_website",

//convert value to http url use string replace, 

// replace any backslashes to slash in this case use chr value "92"

$tmpURL = str_replace(chr(92),'/',$tmpURL);

// now replace any same string in $tmpURL value to null or ''

// and will return value like /localhost/my_website/ or just /my_website/

$tmpURL = str_replace($_SERVER['DOCUMENT_ROOT'],'',$tmpURL);

// delete any slash character in first and last of value

$tmpURL = ltrim($tmpURL,'/');

$tmpURL = rtrim($tmpURL, '/');


// check again if we find any slash string in value then we can assume its local machine

    if (strpos($tmpURL,'/')){

// explode that value and take only first value

       $tmpURL = explode('/',$tmpURL);

       $tmpURL = $tmpURL[0];

      }

// now last steps

// assign protocol in first value

   if ($tmpURL !== $_SERVER['HTTP_HOST'])

// if protocol its http then like this

      $base_url .= $_SERVER['HTTP_HOST'].'/'.$tmpURL.'/';

    else

// else if protocol is https

      $base_url .= $tmpURL.'/';

// give return value

return $base_url; 

}

?>

// and test it

echo home_base_url();

la salida tendrá gusto de esto:

local machine : http://localhost/my_website/ or https://myhost/my_website 

public : http://www.my_website.com/ or https://www.my_website.com/

use la home_base_urlfunción index.phpde su sitio web y defínalo

y luego puede usar esta función para cargar scripts, CSS y contenido a través de URL como

<?php

echo '<script type="text/javascript" src="'.home_base_url().'js/script.js"></script>'."\n";

?>

creará una salida como esta:

<script type="text/javascript" src="http://www.my_website.com/js/script.js"></script>

y si este script funciona bien!

Crazy SagaXxX
fuente
2
No incluya enlaces a sus sitios web en sus respuestas
ChrisF
1

Aquí hay uno que acabo de armar que funciona para mí. Devolverá una matriz con 2 elementos. El primer elemento es todo antes del? y el segundo es una matriz que contiene todas las variables de cadena de consulta en una matriz asociativa.

function disectURL()
{
    $arr = array();
    $a = explode('?',sprintf(
        "%s://%s%s",
        isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http',
        $_SERVER['SERVER_NAME'],
        $_SERVER['REQUEST_URI']
    ));

    $arr['base_url']     = $a[0];
    $arr['query_string'] = [];

    if(sizeof($a) == 2)
    {
        $b = explode('&', $a[1]);
        $qs = array();

        foreach ($b as $c)
        {
            $d = explode('=', $c);
            $qs[$d[0]] = $d[1];
        }
        $arr['query_string'] = (count($qs)) ? $qs : '';
    }

    return $arr;

}

Nota: Esta es una expansión de la respuesta proporcionada por maček arriba. (Crédito a quien crédito merece.)

Kenny
fuente
1

Editado en la respuesta de @ user3832931 para incluir el puerto del servidor.

para formar URL como ' https: // localhost: 8000 / folder / '

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Badmus Taofeeq
fuente
0
function server_url(){
    $server ="";

    if(isset($_SERVER['SERVER_NAME'])){
        $server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME'], '/');
    }
    else{
        $server = sprintf("%s://%s%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_ADDR'], '/');
    }
    print $server;

}
Devarajan Sekaran
fuente
0

Intenta usar: $_SERVER['SERVER_NAME'];

Lo usé para hacer eco de la URL base de mi sitio para vincular mi CSS.

<link href="https://<?php echo $_SERVER['SERVER_NAME']; ?>/assets/css/your-stylesheet.css" rel="stylesheet" type="text/css">

¡Espero que esto ayude!

KAZZABE
fuente
0

Tenía la misma pregunta que el OP, pero tal vez un requisito diferente. Creé esta función ...

/**
 * Get the base URL of the current page. For example, if the current page URL is
 * "https://example.com/dir/example.php?whatever" this function will return
 * "https://example.com/dir/" .
 *
 * @return string The base URL of the current page.
 */
function get_base_url() {

    $protocol = filter_input(INPUT_SERVER, 'HTTPS');
    if (empty($protocol)) {
        $protocol = "http";
    }

    $host = filter_input(INPUT_SERVER, 'HTTP_HOST');

    $request_uri_full = filter_input(INPUT_SERVER, 'REQUEST_URI');
    $last_slash_pos = strrpos($request_uri_full, "/");
    if ($last_slash_pos === FALSE) {
        $request_uri_sub = $request_uri_full;
    }
    else {
        $request_uri_sub = substr($request_uri_full, 0, $last_slash_pos + 1);
    }

    return $protocol . "://" . $host . $request_uri_sub;

}

... que, por cierto, uso para ayudar a crear URL absolutas que deberían usarse para redirigir.

prohibición de geoingeniería
fuente
0
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

y obtienes algo como

lalala/tralala/something/
Milos Milosevic
fuente
Hay mucho código en esta entrada de preguntas y respuestas que pertenece a la zona de peligro, también esta especialmente debido al uso de PHP_SELF.
Hakre
0

Solo prueba y obtén el resultado.

// output: /myproject/index.php
$currentPath = $_SERVER['PHP_SELF'];
// output: Array ( [dirname] => /myproject [basename] => index.php [extension] => php [filename] => index ) 
$pathInfo = pathinfo($currentPath);
// output: localhost
$hostName = $_SERVER['HTTP_HOST'];
// output: http://
$protocol = strtolower(substr($_SERVER["SERVER_PROTOCOL"],0,5))=='https://'?'https://':'http://';
// return: http://localhost/myproject/
echo $protocol.$hostName.$pathInfo['dirname']."/";
Anjani Barnwal
fuente
0

En mi caso, necesitaba la URL base similar a la RewriteBasecontenida en el .htaccessarchivo.

Por desgracia, simplemente recuperando el RewriteBasedel .htaccessarchivo es imposible con PHP. Pero es posible establecer una variable de entorno en el archivo .htaccess y luego recuperar esa variable en PHP. Simplemente revise estos bits de código:

.htaccess

SetEnv BASE_PATH /

index.php

Ahora uso esto en la etiqueta base de la plantilla (en la sección de encabezado de la página):

<base href="<?php echo ! empty( getenv( 'BASE_PATH' ) ) ? getenv( 'BASE_PATH' ) : '/'; ?>"/>

Entonces, si la variable no estaba vacía, la usamos. De lo contrario, recurrir a la /ruta base predeterminada.

Según el entorno, la URL base siempre será correcta. Utilizo /como URL base en sitios web locales y de producción. Pero /foldername/para el entorno de puesta en escena.

Todos tenían los suyos .htaccessen primer lugar porque RewriteBase era diferente. Entonces esta solución me funciona.

Floris
fuente
0

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

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

Si desea admitir tanto HTTP como HTTPS, puede usar esta solución

$current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

Esto funcionó para mí. Espero que esto también te ayude. Gracias por hacer esta pregunta.

Kamlesh
fuente