ฉันจะรับ URL พื้นฐานด้วย PHP ได้อย่างไร


145

ฉันใช้XAMPPบน Windows Vista http://127.0.0.1/test_website/ในการพัฒนาของฉันฉันมี

ฉันจะhttp://127.0.0.1/test_website/ใช้ PHP ได้อย่างไร

ฉันลองทำสิ่งเหล่านี้แล้ว แต่ก็ไม่ได้ผล

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

1
พวกเขาไม่ทำงานได้อย่างไร? พวกเขากลับมาเพื่ออะไร?
animuson

6
@animuson ค่าคงที่เหล่านั้นส่งคืนเส้นทางระบบไฟล์ในเครื่องไม่ใช่ URL
ceejayoz

อาจซ้ำกันได้ของGet the full URL ใน PHP
T.Todua

คำตอบ:


259

ลองสิ่งนี้:

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

เรียนรู้เพิ่มเติมเกี่ยวกับตัวแปรที่กำหนดไว้ล่วงหน้า$_SERVER

หากคุณวางแผนที่จะใช้ https คุณสามารถใช้สิ่งนี้:

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

ต่อคำตอบนี้โปรดให้แน่ใจว่าการกำหนดค่าของ Apache SERVER_NAMEถูกต้องเพื่อให้คุณได้อย่างปลอดภัยสามารถขึ้นอยู่กับ

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

หมายเหตุ : หากคุณขึ้นอยู่กับHTTP_HOSTคีย์ (ซึ่งมีอินพุตของผู้ใช้) คุณยังคงต้องทำการล้างบางอย่างลบช่องว่างเครื่องหมายจุลภาคการคืนค่าขนส่ง ฯลฯ สิ่งใดก็ตามที่ไม่ใช่อักขระที่ถูกต้องสำหรับโดเมน ตรวจสอบฟังก์ชันPHP builtin parse_urlสำหรับตัวอย่าง


2
ควรตรวจสอบ$_SERVER['HTTPS']และเปลี่ยนhttps://แทนhttp://ในกรณีดังกล่าว
ceejayoz

2
ขอบคุณคุณฉันต้องการฟังก์ชั่นนี้
Brice Favre

2
แล้ว $ _SERVER ['REQUEST_SCHEME'] ล่ะ ไม่ง่ายกว่านั้นหรือ
หนาวจัด

2
วิธีนี้ใช้ไม่ได้หากคุณใช้พอร์ตที่แตกต่างจาก 80 :(
M'sieur Toph '10

1
@admdrew ขอบคุณ ฉันตรวจสอบอีกครั้งว่าREQUEST_URIมี/; มันทำ @swarnenduโปรดระมัดระวังมากขึ้นเมื่อแก้ไขคำตอบของผู้อื่น นั่นควรเป็นความคิดเห็นแทน
maček

30

ฟังก์ชันที่ปรับให้ดำเนินการโดยไม่มีคำเตือน:

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
ฉันรู้ว่าฉันเคยทำสิ่งนี้มาก่อน แต่จำไม่ได้ว่าด้วยเหตุผลบางประการ ขอบคุณ!
Kyle Coots

ฉันต้องการตั้งค่า URL บ้านเป็นรูปภาพส่วนหัว เมื่อผู้ใช้อยู่ในหน้าอื่นที่ไม่ใช่หน้าแรกควรเปลี่ยนเส้นทางไปยังหน้าแรกโดยคลิกที่รูปภาพส่วนหัว ฉันจะทำเช่นนั้นได้อย่างไร?
Joey

21

ข้อมูลโค้ด '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;
    }
}

ใช้ง่ายเหมือน:

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


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

ใช้งานง่ายเพียงแค่
เอาท์พุท:

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

1
ไม่ใช่วิธีที่ดีที่สุดในการรับ URL ฐาน
Anjani Barnwal

@AnjaniBarnwal อธิบายได้ไหมว่าทำไม? ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดหากคุณมีสตริงที่มี url และต้องการรับ URL ฐานเช่นhttps://example.comจากhttps://example.com/category2/page2.html?q=2#lorem-ipsum- ซึ่งไม่มีส่วนเกี่ยวข้องกับเพจปัจจุบันที่คุณอยู่
OZZIE

7

ฉันคิดว่า$_SERVERsuperglobal มีข้อมูลที่คุณต้องการ อาจเป็นดังนี้:

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

คุณสามารถดูเอกสาร PHP ที่เกี่ยวข้องที่นี่


สิ่งนี้จะเปลี่ยนเส้นทางไปยังผู้ใช้เพจเดียวกันอยู่ในขณะนี้ ฉันจะแก้ไขปัญหานี้เพื่อเปลี่ยนเส้นทางไปยังโฮมเพจได้อย่างไร ฉันใช้ apache, localhost php7
Joey

6

ลองใช้รหัสต่อไปนี้:

$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

รหัสต่อไปนี้จะช่วยลดปัญหาในการตรวจสอบโปรโตคอล $ _SERVER ['APP_URL'] จะแสดงชื่อโดเมนด้วยโปรโตคอล

$ _SERVER ['APP_URL'] จะส่งคืนโปรโตคอล: // โดเมน (เช่น: - http: // localhost )

$ _SERVER ['REQUEST_URI'] สำหรับส่วนที่เหลือของ url เช่น/ directory / subdirectory / something / else

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

ผลลัพธ์จะเป็นแบบนี้

http: // localhost / ไดเร็กทอรี / ไดเร็กทอรีย่อย / something / else


1
แทนที่จะวางโค้ดแบบสุ่มให้อธิบายว่าคุณทำอะไรและทำไม ด้วยวิธีนี้ OP และผู้อ่านในอนาคตที่มีปัญหาเดียวกันสามารถเรียนรู้บางสิ่งจากคำตอบของคุณได้แทนที่จะแค่คัดลอก / วางและถามคำถามเดิมอีกครั้งในวันพรุ่งนี้
Oldskool

3

ฉันพบสิ่งนี้ใน http://webcheatsheet.com/php/get_current_page_url.php

เพิ่มรหัสต่อไปนี้ในหน้า:

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

ตอนนี้คุณสามารถรับ URL ของหน้าปัจจุบันโดยใช้บรรทัด:

<?php
  echo curPageURL();
?>

บางครั้งจำเป็นต้องได้รับชื่อเพจเท่านั้น ตัวอย่างต่อไปนี้แสดงวิธีการทำ:

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

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


2

ลองทำตามนี้ มันใช้ได้กับฉัน

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

ใช้แบบนี้:

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

เคล็ดลับง่ายๆง่ายๆ:

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

URL มีลักษณะดังนี้: http://example.com/folder/


2

คุณสามารถทำเช่นนี้ได้ แต่ขออภัยภาษาอังกฤษของฉันไม่ดีพอ

ขั้นแรกรับ url ฐานบ้านด้วยรหัสง่ายๆนี้ ..

ฉันได้ทดสอบรหัสนี้บนเซิร์ฟเวอร์ภายในและสาธารณะแล้วและผลลัพธ์ก็ออกมาดี

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

ผลลัพธ์จะเป็นเช่นนี้:

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

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

ใช้home_base_urlฟังก์ชันที่index.phpเว็บไซต์ของคุณและกำหนด

จากนั้นคุณสามารถใช้ฟังก์ชันนี้เพื่อโหลดสคริปต์ css และเนื้อหาผ่าน url เช่น

<?php

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

?>

จะสร้างผลลัพธ์ดังนี้:

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

และถ้าสคริปต์นี้ใช้งานได้ดี,!


2
โปรดอย่าใส่ลิงก์ไปยังเว็บไซต์ของคุณในคำตอบของคุณ
ChrisF

1

นี่คือสิ่งที่ฉันเพิ่งรวบรวมที่เหมาะกับฉัน มันจะส่งคืนอาร์เรย์ที่มี 2 องค์ประกอบ องค์ประกอบแรกคือทุกอย่างก่อน? และที่สองคืออาร์เรย์ที่มีตัวแปรสตริงคิวรีทั้งหมดในอาร์เรย์ที่เชื่อมโยงกัน

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;

}

หมายเหตุ: นี่เป็นการขยายคำตอบจาก maek ด้านบน (เครดิตที่ครบกำหนดเครดิต)



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

ลองใช้: $_SERVER['SERVER_NAME'];

ฉันใช้มันเพื่อสะท้อน URL ฐานของไซต์ของฉันเพื่อเชื่อมโยง css ของฉัน

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

หวังว่านี่จะช่วยได้!


0

ฉันมีคำถามเดียวกันกับ OP แต่อาจมีข้อกำหนดที่แตกต่างออกไป ฉันสร้างฟังก์ชั่นนี้ ...

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

}

... ซึ่งบังเอิญฉันใช้เพื่อช่วยสร้าง URL ที่สมบูรณ์ที่ควรใช้สำหรับการเปลี่ยนเส้นทาง


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

และคุณจะได้รับสิ่งที่ชอบ

lalala/tralala/something/

มีรหัสจำนวนมากในรายการถามตอบนี้ที่อยู่ในเขตอันตรายอันนี้เช่นกันโดยเฉพาะอย่างยิ่งเนื่องจากการใช้ PHP_SELF
hakre

0

เพียงแค่ทดสอบและรับผล

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

ในกรณีของฉันฉันต้องการ URL พื้นฐานที่คล้ายกับที่RewriteBaseมีอยู่ใน.htaccessไฟล์

น่าเสียดายที่การดึงไฟล์RewriteBaseจาก.htaccessไฟล์เป็นไปไม่ได้ด้วย PHP แต่เป็นไปได้ที่จะตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์. htaccess จากนั้นดึงตัวแปรนั้นใน PHP เพียงตรวจสอบบิตของโค้ดเหล่านี้ออก:

.htaccess

SetEnv BASE_PATH /

index.php

ตอนนี้ฉันใช้สิ่งนี้ในแท็กฐานของเทมเพลต (ในส่วนหัวของหน้า):

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

ดังนั้นหากตัวแปรไม่ว่างเราก็ใช้มัน มิฉะนั้นทางเลือก/เป็นเส้นทางพื้นฐานเริ่มต้น

ตามสภาพแวดล้อม url พื้นฐานจะถูกต้องเสมอ ฉันใช้/เป็น URL ฐานบนเว็บไซต์ท้องถิ่นและเว็บไซต์ที่ใช้งานจริง แต่/foldername/สำหรับสภาพแวดล้อมการแสดงละคร

พวกเขาทั้งหมดมีของตัวเอง.htaccessตั้งแต่แรกเพราะ RewriteBase นั้นแตกต่างกัน วิธีนี้ใช้ได้กับฉัน


0

ดูที่ $ _SERVER ['REQUEST_URI'] เช่น

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

หากคุณต้องการรองรับทั้ง HTTP และ HTTPS คุณสามารถใช้โซลูชันนี้ได้

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

สิ่งนี้ได้ผลสำหรับฉัน ฉันหวังว่านี่จะช่วยคุณได้เช่นกัน ขอบคุณที่ถามคำถามนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.