PHP로 기본 URL을 얻으려면 어떻게해야합니까?


139

Windows Vista에서 XAMPP 를 사용하고 있습니다. 내 개발에서 나는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

가능한 복제본 PHP에서 전체 URL 얻기
T.Todua

답변:


251

이 시도:

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

이 답변 , 안전하게에 의존 할 수 있도록 제대로 아파치를 구성 할 수 있는지 확인하십시오 SERVER_NAME.

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

참고 : HTTP_HOST사용자 입력이 포함 된 키 에 의존하는 경우 에도 정리, 공백, 쉼표, 캐리지 리턴 등을 제거해야합니다. 도메인에 유효한 문자가 아닌 것은 무엇이든해야합니다. PHP 내장 parse_url 함수를 확인하십시오 .


2
그러한 경우 대신 체크인 $_SERVER['HTTPS']하고 교체 해야 합니다. https://http://
ceejayoz

2
덕분 에이 기능이 필요했습니다.
Brice Favre

2
$ _SERVER [ 'REQUEST_SCHEME']는 어떻습니까? 그렇게 간단하지 않습니까?
frostymarvelous

2
80과 다른 포트를 사용하는 경우에는 작동하지 않습니다. :(
M'sieur Toph '

1
@admdrew 감사합니다. 나는 REQUEST_URI이미 /; 그렇습니다. @swarnendu 다른 사람들의 답변을 편집 할 때 더 조심하십시오. 그것은 그 대신에 주석 이었어 야했다.
maček

28

경고없이 실행되도록 조정 된 기능 :

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 2013

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

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

용법:

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

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

$_SERVER슈퍼 글로벌에 원하는 정보가 있다고 생각합니다 . 다음과 같을 수 있습니다.

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

여기 에서 관련 PHP 문서를 볼 수 있습니다 .


현재 사용자와 동일한 페이지로 계속 리디렉션됩니다. 이 문제를 해결하여 홈페이지로 리디렉션하려면 어떻게해야합니까? 아파치, 로컬 호스트에 임. php7
Joey

5

다음 코드를 시도하십시오.

$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']은 protocol : // domain을 반환 합니다 (예 : http : // localhost). )

/ directory / subdirectory / something / else 와 같이 URL의 나머지 부분에 대한 $ _SERVER [ 'REQUEST_URI']

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

출력은 다음과 같습니다

http : // localhost / directory / subdirectory / 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
$http = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'? "https://" : "http://";

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

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하고 정의하십시오

그런 다음이 함수를 사용하여 다음과 같은 URL을 통해 스크립트, CSS 및 내용을로드 할 수 있습니다

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

}

참고 : 위의 maček에서 제공 한 답변의 확장입니다. (신용 기한이있는 크레디트)



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="https://stackoverflow.com//<?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/

이 Q & A 항목에는 위험 영역에 속하는 많은 코드가 있습니다. 특히 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

내 경우에는에 RewriteBase포함 된 것과 비슷한 기본 URL이 필요 했습니다..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/준비 환경에서.

.htaccessRewriteBase가 다르기 때문에 그들은 모두 처음부터 자신의 소유 였습니다. 따라서이 솔루션은 저에게 효과적입니다.


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.