Làm cách nào để có được URL cơ sở với PHP?


139

Tôi đang sử dụng XAMPP trên Windows Vista. Trong sự phát triển của tôi, tôi có http://127.0.0.1/test_website/.

Làm thế nào để tôi có được http://127.0.0.1/test_website/với PHP?

Tôi đã thử một cái gì đó như thế này, nhưng không ai trong số họ làm việc.

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

1
Làm thế nào mà họ không làm việc? Họ đã trở về cái gì?
phim hoạt hình

6
@animuson Những hằng số đó trả về đường dẫn hệ thống tệp cục bộ, không phải URL.
ceejayoz

có thể trùng lặp với Nhận URL đầy đủ trong PHP
T.Todua

Câu trả lời:


251

Thử cái này:

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

Tìm hiểu thêm về $_SERVERbiến được xác định trước .

Nếu bạn có kế hoạch sử dụng https, bạn có thể sử dụng điều này:

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

Mỗi câu trả lời này , hãy chắc chắn để cấu hình Apache của bạn đúng cách, do đó bạn có thể yên tâm dựa vào SERVER_NAME.

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

LƯU Ý : Nếu bạn phụ thuộc vào HTTP_HOSTkhóa (chứa đầu vào của người dùng), bạn vẫn phải thực hiện một số thao tác dọn dẹp, xóa dấu cách, dấu phẩy, trả lại vận chuyển, v.v. Bất kỳ điều gì không phải là ký tự hợp lệ cho tên miền. Kiểm tra hàm parse_url của PHP để lấy ví dụ.


2
Nên kiểm tra $_SERVER['HTTPS']và trao đổi https://thay vì http://trong những trường hợp đó.
ceejayoz

2
Nhờ bạn, tôi cần chức năng này.
Brice Favre

2
Còn $ _SERVER ['REQUEST_SCHEME'] thì sao? không đơn giản hơn sao?
frostymarvelous

2
Điều này không hoạt động nếu bạn đang sử dụng một cổng khác với 80. :(
M'sieur Toph '

1
@admdrew cảm ơn. Tôi đã kiểm tra lại REQUEST_URIđã bao gồm a /; nó làm @swarnendu vui lòng cẩn thận hơn khi chỉnh sửa câu trả lời của người khác. Thay vào đó nên là một bình luận.
maček

28

Chức năng được điều chỉnh để thực thi mà không có cảnh báo:

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
Tôi biết tôi đã làm điều này trước khi không thể nhớ làm thế nào vì một số lý do. Cảm ơn!
Kyle Coots

Tôi cần đặt url nhà để hình ảnh tiêu đề. khi người dùng ở một số trang khác ngoài nhà, anh ấy / cô ấy nên được chuyển hướng đến trang chủ bằng cách nhấp vào hình ảnh tiêu đề. Làm thế nào tôi có thể làm điều đó?
Joey

21

Đoạn trích 'base_url' thú vị!

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

Sử dụng đơn giản như:

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

Sử dụng:

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

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

Nó chỉ đơn giản để sử dụng
Đầu ra:

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

1
đó không phải là cách tốt nhất để lấy url cơ sở.
Anigate Barnwal

@An cameraBarnwal bạn có thể giải thích tại sao? Tôi nghĩ rằng đây là cách tốt nhất nếu bạn có một chuỗi có url và muốn lấy url cơ sở như https://example.comtừ https://example.com/category2/page2.html?q=2#lorem-ipsum- điều đó không liên quan gì đến trang hiện tại bạn đang ở.
OZZIE

7

Tôi nghĩ rằng siêu lớp $_SERVERcó thông tin bạn đang tìm kiếm. Nó có thể là một cái gì đó như thế này:

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

Bạn có thể xem tài liệu PHP có liên quan ở đây .


điều này tiếp tục chuyển hướng đến cùng một người dùng trang bây giờ. Làm thế nào tôi có thể sửa lỗi này để chuyển hướng đến trang chủ? Tôi đang trên apache, localhost. php7
Joey

5

Hãy thử đoạn mã sau:

$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

Các mã sau đây sẽ giảm vấn đề để kiểm tra giao thức. $ _SERVER ['APP_URL'] sẽ hiển thị tên miền với giao thức

$ _SERVER ['APP_URL'] sẽ trả về giao thức: // domain (ví dụ: - http: // localhost )

$ _SERVER ['REQUEST_URI'] cho các phần còn lại của url, chẳng hạn như / thư mục / thư mục con / cái gì đó / khác

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

Đầu ra sẽ như thế này

http: // localhost / thư mục / thư mục con / cái gì đó / khác


1
Thay vì chỉ dán một bó mã ngẫu nhiên, hãy giải thích những gì bạn đã làm và tại sao. Bằng cách đó, OP và bất kỳ độc giả tương lai nào có cùng vấn đề thực sự có thể học được điều gì đó từ câu trả lời của bạn, thay vì chỉ sao chép / dán nó và hỏi lại cùng một câu hỏi vào ngày mai.
Oldskool

3

Tôi đã tìm thấy điều này trên http://webchcoateet.com/php/get_cản_page_url.php

Thêm mã sau vào một trang:

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

Bây giờ bạn có thể nhận URL trang hiện tại bằng cách sử dụng dòng:

<?php
  echo curPageURL();
?>

Đôi khi chỉ cần lấy tên trang. Ví dụ sau đây cho thấy cách thực hiện:

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

Thử cái này. Nó làm việc cho tôi.

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

Sử dụng như thế này:

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

Thủ thuật đơn giản và dễ dàng:

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

URL trông như thế này: http://example.com/folder/


2

Bạn có thể làm như thế này, nhưng xin lỗi tiếng Anh của tôi không đủ tốt.

Đầu tiên, lấy url cơ sở nhà với mã đơn giản này ..

Tôi đã kiểm tra mã này trên máy chủ cục bộ và công khai và kết quả rất tốt.

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

đầu ra sẽ như thế này:

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

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

sử dụng home_base_urlchức năng tại index.phptrang web của bạn và xác định nó

và sau đó bạn có thể sử dụng chức năng này để tải tập lệnh, css và nội dung qua url như

<?php

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

?>

sẽ tạo đầu ra như thế này:

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

và nếu kịch bản này hoạt động tốt ,,!


2
Vui lòng không bao gồm các liên kết đến trang web của bạn trong câu trả lời của bạn
ChrisF

1

Đây là một cái tôi chỉ cần làm việc với tôi. Nó sẽ trả về một mảng với 2 phần tử. Yếu tố đầu tiên là mọi thứ trước? và thứ hai là một mảng chứa tất cả các biến chuỗi truy vấn trong một mảng kết hợp.

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;

}

Lưu ý: Đây là bản mở rộng của câu trả lời được cung cấp bởi maček ở trên. (Tín dụng có tín dụng đến hạn.)



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

Hãy thử sử dụng: $_SERVER['SERVER_NAME'];

Tôi đã sử dụng nó để lặp lại url cơ sở của trang web của tôi để liên kết css của tôi.

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

Hi vọng điêu nay co ich!


0

Tôi đã có cùng một câu hỏi như OP, nhưng có thể là một yêu cầu khác. Tôi đã tạo chức năng này ...

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

}

... trong đó, tình cờ, tôi sử dụng để giúp tạo các URL tuyệt đối nên được sử dụng để chuyển hướng.


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

và bạn nhận được một cái gì đó như

lalala/tralala/something/

Có rất nhiều mã trên mục Hỏi & Đáp này thuộc về khu vực nguy hiểm, điều này cũng đặc biệt là do việc sử dụng PHP_SELF.
hakre

0

Chỉ cần kiểm tra và nhận được kết quả.

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

Trong trường hợp của tôi, tôi cần URL cơ sở tương tự như RewriteBasetrong .htaccesstệp.

Thật không may, chỉ đơn giản là lấy ra RewriteBasetừ .htaccesstệp là không thể với PHP. Nhưng có thể đặt biến môi trường trong tệp .htaccess và sau đó truy xuất biến đó trong PHP. Chỉ cần kiểm tra các bit mã này:

.htaccess

SetEnv BASE_PATH /

index.php

Bây giờ tôi sử dụng điều này trong thẻ cơ sở của mẫu (trong phần đầu của trang):

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

Vì vậy, nếu biến không trống, chúng tôi sử dụng nó. Nếu không, dự phòng /là đường dẫn cơ sở mặc định.

Dựa trên môi trường, url cơ sở sẽ luôn chính xác. Tôi sử dụng /làm url cơ sở trên các trang web địa phương và sản xuất. Nhưng /foldername/đối với môi trường dàn dựng.

Tất cả họ đều có vị trí của riêng mình .htaccessngay từ đầu vì RewriteBase khác biệt. Vì vậy, giải pháp này làm việc cho tôi.


0

Hãy xem $ _SERVER ['REQUEST_URI'], tức là

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

Nếu bạn muốn hỗ trợ cả HTTP và HTTPS, bạn có thể sử dụng giải pháp này

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

Điều này làm việc cho tôi. Tôi hy vọng, điều này cũng sẽ giúp bạn. Cảm ơn đã hỏi câu hỏi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.