Jak uzyskać podstawowy adres URL w PHP?

139

Używam XAMPP w systemie Windows Vista. W moim rozwoju mam http://127.0.0.1/test_website/.

Jak korzystać http://127.0.0.1/test_website/z PHP?

Próbowałem czegoś takiego, ale żaden z nich nie działał.

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.
piszczel
źródło
1
Jak one nie działały? Co oni wrócili?
animuson
6
@animuson Te stałe zwracają ścieżki lokalnego systemu plików, a nie adresy URL.
ceejayoz
możliwy duplikat Pobierz pełny adres URL w PHP
T.Todua

Odpowiedzi:

251

Spróbuj tego:

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

Dowiedz się więcej o $_SERVERpredefiniowanej zmiennej .

Jeśli planujesz używać protokołu https, możesz użyć tego:

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

Zgodnie z tą odpowiedzią upewnij się, że poprawnie skonfigurowałeś swój Apache, abyś mógł bezpiecznie polegać SERVER_NAME.

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

UWAGA : Jeśli polegasz na HTTP_HOSTkluczu (który zawiera dane wejściowe użytkownika), nadal musisz wykonać pewne porządki, usunąć spacje, przecinki, powrót karetki itp. Wszystko, co nie jest prawidłowym znakiem dla domeny. Sprawdź na przykład wbudowaną funkcję parse_url w PHP .

maček
źródło
2
Powinien sprawdzić $_SERVER['HTTPS']i zamienić się https://zamiast http://w takich przypadkach.
ceejayoz
2
Dzięki tobie potrzebowałem tej funkcji.
Brice Favre
2
a co z $ _SERVER ['REQUEST_SCHEME']? czy to nie jest prostsze?
frostymarvellous
2
To nie działa, jeśli używasz portu innego niż 80. :(
M'sieur Toph '10
1
@admdrew thanks. Dwukrotnie sprawdziłem, czy REQUEST_URIzawiera już /; to robi. @swarnendu, zachowaj ostrożność podczas edytowania odpowiedzi innych osób. Zamiast tego powinien to być komentarz.
maček
28

Funkcja dostosowana do wykonywania bez ostrzeżeń:

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
źródło
1
Wiedziałem, że robiłem to wcześniej, ale z jakiegoś powodu nie mogłem sobie przypomnieć, jak to zrobić. Dzięki!
Kyle Coots
Muszę ustawić adres URL strony głównej na obraz nagłówka. kiedy użytkownik znajduje się na innej stronie niż strona główna, powinien zostać przekierowany na stronę główną, klikając obraz nagłówka. Jak mogę to zrobić?
Joey
21

Zabawny fragment kodu „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;
    }
}

Użyj tak prostego, jak:

//  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
źródło
15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Stosowanie:

print "<script src='{$base_url}js/jquery.min.js'/>";
user3832931
źródło
13
$modifyUrl = parse_url($url);
print_r($modifyUrl)

Jest po prostu prosty w użyciu
Wyjście:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)
agravat.in
źródło
1
nie jest to najlepszy sposób na uzyskanie podstawowego adresu URL.
Anjani Barnwal
@AnjaniBarnwal Czy możesz wyjaśnić dlaczego? Myślę, że jest to najlepszy sposób, jeśli masz ciąg z adresem URL i chcesz uzyskać podstawowy adres URL, taki jak https://example.comz https://example.com/category2/page2.html?q=2#lorem-ipsum- nie ma to nic wspólnego z bieżącą stroną, na której się znajdujesz.
OZZIE
7

Myślę, że $_SERVERsuperglobal ma informacje, których szukasz. Może to być coś takiego:

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

Możesz zobaczyć odpowiednią dokumentację PHP tutaj .

Jeremy DeGroot
źródło
powoduje to przekierowanie do tej samej strony, w której znajduje się teraz użytkownik. jak mogę to naprawić, aby przekierować do strony głównej? Jestem na Apache, localhost. php7
Joey
5

Wypróbuj następujący kod:

$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
źródło
4

Poniższy kod zmniejszy problem przy sprawdzaniu protokołu. $ _SERVER ['APP_URL'] wyświetli nazwę domeny z protokołem

$ _SERVER ['APP_URL'] zwróci protokół: // domena (np .: - http: // localhost )

$ _SERVER ['REQUEST_URI'] dla pozostałych części adresu URL, takich jak / katalog / podkatalog / coś / jeszcze

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

Wynik byłby taki

http: // localhost / katalog / podkatalog / coś / jeszcze

Jijesh Cherrai
źródło
1
Zamiast po prostu wklejać losowy kod, wyjaśnij, co zrobiłeś i dlaczego. W ten sposób OP i wszyscy przyszli czytelnicy z tym samym problemem mogą faktycznie nauczyć się czegoś z Twojej odpowiedzi, zamiast po prostu skopiować / wkleić ją i zadać to samo pytanie jutro.
Oldskool
3

Znalazłem to na http://webcheatsheet.com/php/get_current_page_url.php

Dodaj następujący kod do strony:

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

Możesz teraz uzyskać adres URL bieżącej strony za pomocą wiersza:

<?php
  echo curPageURL();
?>

Czasami potrzebne jest tylko pobranie nazwy strony. Poniższy przykład pokazuje, jak to zrobić:

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

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

$url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];
Farid Bangash
źródło
2

Spróbuj tego. Mi to pasuje.

/*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]);
    }
}

Użyj w ten sposób:

<?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
źródło
2

Prosta i łatwa sztuczka:

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

URL wygląda następująco: http://example.com/folder/

Ali Akhtar
źródło
2

Możesz to zrobić w ten sposób, ale przepraszam, mój angielski nie jest wystarczająco dobry.

Najpierw uzyskaj podstawowy adres URL za pomocą tego prostego kodu.

Przetestowałem ten kod na moim serwerze lokalnym i publicznym i wynik jest dobry.

<?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();

wyjście będzie wyglądać tak:

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

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

użyj home_base_urlfunkcji windex.php swojej witrynie i zdefiniuj ją

a następnie możesz użyć tej funkcji do ładowania skryptów, css i treści za pośrednictwem adresu URL, takiego jak

<?php

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

?>

utworzy takie wyjście:

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

i jeśli ten skrypt działa dobrze,!

Crazy SagaXxX
źródło
2
Prosimy nie umieszczać w odpowiedziach linków do swoich witryn internetowych
ChrisF
1

Oto jeden, który właśnie złożyłem i który mi odpowiada. Zwróci tablicę z 2 elementami. Pierwszym elementem jest wszystko przed? a druga to tablica zawierająca wszystkie zmienne będące ciągami zapytania w tablicy asocjacyjnej.

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;

}

Uwaga: jest to rozwinięcie odpowiedzi udzielonej przez maček powyżej. (Kredyt w przypadku, gdy kredyt jest należny).

Kenny
źródło
1

Edytowano odpowiedź @ user3832931, aby uwzględnić port serwera.

do tworzenia adresów URL, takich jak „ https: // localhost: 8000 / folder /

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';
Badmus Taofeeq
źródło
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
źródło
0

Spróbuj użyć: $_SERVER['SERVER_NAME'];

Użyłem go do powtórzenia podstawowego adresu URL mojej witryny, aby połączyć mój css.

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

Mam nadzieję że to pomoże!

KAZZABE
źródło
0

Miałem to samo pytanie co OP, ale może inny wymóg. Stworzyłem tę funkcję ...

/**
 * 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;

}

... którego, nawiasem mówiąc, używam do tworzenia bezwzględnych adresów URL, które powinny być używane do przekierowań.

zakaz geoinżynierii
źródło
0
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

i dostajesz coś takiego

lalala/tralala/something/
Milos Milosevic
źródło
W tym wpisie pytań i odpowiedzi jest dużo kodu, który należy do strefy zagrożenia, również ten, szczególnie ze względu na użycie PHP_SELF.
hakre
0

Po prostu przetestuj i uzyskaj wynik.

// 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
źródło
0

W moim przypadku potrzebowałem podstawowego adresu URL podobnego do RewriteBasezawartego w.htaccess pliku.

Niestety samo pobranie pliku RewriteBasez .htaccesspliku jest niemożliwe w PHP. Ale możliwe jest ustawienie zmiennej środowiskowej w pliku .htaccess, a następnie pobranie tej zmiennej w PHP. Po prostu sprawdź te fragmenty kodu:

.htaccess

SetEnv BASE_PATH /

index.php

Teraz używam tego w tagu podstawowym szablonu (w sekcji nagłówkowej strony):

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

Więc jeśli zmienna nie była pusta, używamy jej. W przeciwnym razie powrót do /domyślnej ścieżki bazowej.

Bazując na środowisku, podstawowy adres URL będzie zawsze poprawny. Używam /jako podstawowego adresu URL na stronach lokalnych i produkcyjnych. Ale /foldername/w środowisku przejściowym.

Wszyscy mieli swoje własne, .htaccessponieważ RewriteBase było inne. Więc to rozwiązanie działa dla mnie.

Floris
źródło
0

Spójrz na $ _SERVER ['REQUEST_URI'], tj

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

Jeśli chcesz obsługiwać zarówno HTTP, jak i HTTPS, możesz skorzystać z tego rozwiązania

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

To zadziałało dla mnie. Mam nadzieję, że to również ci pomoże. Dziękuję, że zadałeś to pytanie.

Kamlesh
źródło