PHP ile temel URL'yi nasıl edinebilirim?


139

Windows Vista'da XAMPP kullanıyorum . Gelişimimde var http://127.0.0.1/test_website/.

http://127.0.0.1/test_website/PHP ile nasıl edinebilirim ?

Böyle bir şey denedim ama hiçbiri işe yaramadı.

echo dirname(__FILE__)
or
echo basename(__FILE__);
etc.

1
Nasıl çalışmadılar? Ne döndüler?
animuson

6
@animuson Bu sabitler URL'leri değil, yerel dosya sistemi yollarını döndürür.
ceejayoz

Yanıtlar:


251

Bunu dene:

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

$_SERVERÖnceden tanımlanmış değişken hakkında daha fazla bilgi edinin .

Https kullanmayı planlıyorsanız, bunu kullanabilirsiniz:

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

Bu cevap başına , lütfen güvenli bir şekilde güvenebilmeniz için Apache'nizi doğru bir şekilde yapılandırdığınızdan emin olun SERVER_NAME.

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

NOT : HTTP_HOSTTuşa (kullanıcı girişini içeren) bağlıysanız , yine de bir miktar temizleme yapmanız, boşluk, virgül, satır başı vb. Kaldırmanız gerekir. Bir alan için geçerli bir karakter olmayan her şey. Örnek için PHP yerleşik parse_url işlevini kontrol edin .


2
Kontrol edelim $_SERVER['HTTPS']ve takas https://yerine http://bu durumlarda.
ceejayoz

2
Sayende bu işleve ihtiyacım vardı.
Brice Favre

2
$ _SERVER ['REQUEST_SCHEME'] ne olacak? bu daha basit değil mi?
ayaz

2
80'den farklı bir bağlantı noktası kullanıyorsanız bu işe yaramaz. :(
M'sieur Toph '

1
@admdrew teşekkürler. REQUEST_URIZaten bir içeren çift ​​kontrol /; öyle. @swarnendu lütfen başkalarının yanıtlarını düzenlerken daha dikkatli olun. Bunun yerine bir yorum olmalıydı.
maček

28

Uyarı olmadan yürütmek için ayarlanmış işlev:

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'];
}

1
Bunu daha önce yaptığımı biliyordum, nedenini hatırlayamıyordum. Teşekkürler!
Kyle Coots

Ana sayfa URL'sini başlık resmine ayarlamam gerekiyor. kullanıcı ana sayfadan başka bir sayfada olduğunda, başlık resmini tıklayarak ana sayfaya yönlendirilmelidir. Bunu nasıl yapabilirim?
Joey

21

Eğlenceli 'base_url' snippet'i!

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 kadar basit kullanın:

//  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/"
//      }

15
   $base_url="http://".$_SERVER['SERVER_NAME'].dirname($_SERVER["REQUEST_URI"].'?').'/';

Kullanımı:

print "<script src='{$base_url}js/jquery.min.js'/>";

13
$modifyUrl = parse_url($url);
print_r($modifyUrl)

Kullanımı sadece basit
Çıktı:

Array
(
    [scheme] => http
    [host] => aaa.bbb.com
    [path] => /
)

1
temel URL'yi almanın en iyi yolu değildir.
Anjani Barnwal

@AnjaniBarnwal nedenini açıklayabilir misin? Senin bir URL'ye sahip bir dize varsa ve benzeri baz url almak istiyorsanız bu iyi yol olduğunu düşünüyoruz https://example.comdan https://example.com/category2/page2.html?q=2#lorem-ipsumsen altındadır geçerli sayfayla ilgisi yoktur -.
OZZIE

7

$_SERVERSüper küreselin aradığınız bilgiye sahip olduğunu düşünüyorum . Bunun gibi bir şey olabilir:

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

İlgili PHP belgelerini burada görebilirsiniz .


bu, şu anda aynı sayfa kullanıcısına yönlendirmeye devam ediyor. bunu ana sayfaya yönlendirmek için nasıl düzeltebilirim? Apache'deyim, localhost. php7
Joey

5

Aşağıdaki kodu deneyin:

$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'];

4

Aşağıdaki kod, protokolü kontrol etme sorununu azaltacaktır. $ _SERVER ['APP_URL'], protokolle birlikte alan adını görüntüler

$ _SERVER ['APP_URL'] protokolü döndürecek : // domain (ör.: - http: // localhost )

URL'nin / directory / altdizin / bir şey / else gibi kalan bölümleri için $ _SERVER ['REQUEST_URI']

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

Çıktı şöyle olurdu

http: // localhost başka / dizin / alt dizin / şey /


1
Rastgele bir kod grubu yapıştırmak yerine, ne yaptığınızı ve nedenini açıklayın. Bu şekilde, OP ve aynı problemi olan gelecekteki okuyucular, cevabınızı kopyalamak / yapıştırmak ve yarın aynı soruyu tekrar sormak yerine aslında cevabınızdan bir şeyler öğrenebilirler.
Oldskool

3

Bunu üzerinde buldum http://webcheatsheet.com/php/get_current_page_url.php adresinde

Bir sayfaya aşağıdaki kodu ekleyin:

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

Artık geçerli sayfa URL'sini şu satırı kullanarak alabilirsiniz:

<?php
  echo curPageURL();
?>

Bazen yalnızca sayfa adını almak gerekir. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:

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

echo "The current page name is ".curPageName();
?>

2
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

$url = $http . $_SERVER["SERVER_NAME"] . $_SERVER['REQUEST_URI'];

2

Bunu dene. Benim için çalışıyor.

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

Bunun gibi kullanın:

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

2

Basit ve kolay hile:

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

URL şöyle görünür: http://example.com/folder/


2

Böyle yapabilirsin, ama üzgünüm ingilizcem yeterince iyi değil.

İlk olarak, bu basit kod ile ana üs URL'sini alın ..

Bu kodu yerel sunucumda ve genel olarak test ettim ve sonuç iyi.

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

çıktı şöyle olacak:

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

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

web sitenizdeki home_base_urlişlevi kullanın index.phpve tanımlayın

ve sonra bu işlevi komut dosyaları, css ve içeriği URL gibi

<?php

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

?>

şöyle çıktı oluşturur:

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

ve eğer bu script iyi çalışıyorsa ,,!


2
Lütfen yanıtlarınıza web sitelerinize bağlantılar eklemeyin
ChrisF

1

İşte benim için işe yarayan bir tane. 2 elemanlı bir dizi döndürür. İlk unsur? ikincisi ise ilişkilendirilebilir bir dizideki tüm sorgu dizesi değişkenlerini içeren bir dizidir.

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;

}

Not: Bu, yukarıda maček tarafından verilen cevabın bir uzantısıdır. (Kredinin vadesi gelen kredi.)


1

@ User3832931 kullanıcısının yanıtında sunucu bağlantı noktasını içerecek şekilde düzenlendi.

https: // localhost: 8000 / folder / ' gibi URL'ler oluşturmak için

$base_url="http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].dirname($_SERVER["REQUEST_URI"].'?').'/';

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;

}

0

Kullanmayı deneyin: $_SERVER['SERVER_NAME'];

Ben css bağlamak için sitemin temel URL yankı için kullanılır.

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

Bu yardımcı olur umarım!


0

OP ile aynı sorum vardı, ama belki de farklı bir gereksinim. Bu işlevi yarattım ...

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

}

... bu arada, yeniden yönlendirme için kullanılması gereken mutlak URL'ler oluşturmaya yardımcı olmak için kullanıyorum.


0
$some_variable =  substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['REQUEST_URI'], "/")+1);

ve şöyle bir şey elde edersin

lalala/tralala/something/

Bu soru-cevap girişinde tehlike bölgesine ait çok sayıda kod var, bu da özellikle PHP_SELF kullanımı nedeniyle.
hakre

0

Sadece test edin ve sonucu alın.

// 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']."/";

0

Benim durumumda RewriteBase, .htaccessdosyada bulunana benzer temel URL'ye ihtiyacım vardı .

Maalesef sadece alınırken RewriteBasegelen .htaccessdosyanın PHP ile mümkün değildir. Ama bu mümkün .htaccess dosyasında bir ortam değişkeni ayarlamak ve daha sonra PHP'de bu değişkeni almak mümkündür. Sadece bu kod parçalarını kontrol edin:

.htaccess

SetEnv BASE_PATH /

index.php

Şimdi bunu şablonun temel etiketinde (sayfanın baş bölümünde) kullanıyorum:

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

Değişken boş değilse, kullanırız. Aksi takdirde/ , varsayılan temel yol olarak .

Ortama bağlı olarak, temel URL her zaman doğru olacaktır. /Yerel ve üretim web sitelerinde temel url olarak kullanıyorum . Fakat/foldername/ evreleme ortamında.

.htaccessRewriteBase farklı olduğu için hepsinin kendileri vardı . Bu çözüm benim için çalışıyor.


0

$ _SERVER ['REQUEST_URI'] sayfasına bakın, yani

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

Hem HTTP hem de HTTPS'yi desteklemek istiyorsanız, bu çözümü kullanabilirsiniz

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

Bu benim için çalıştı. Umarım bu da size yardımcı olacaktır. Bu soruyu sorduğun için teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.