[php] PHP에서 전체 URL을 얻으십시오

이 코드를 사용하여 전체 URL을 얻습니다.

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

문제는 내에서 일부 마스크를 사용 .htaccess하므로 URL에서 볼 수있는 것이 항상 파일의 실제 경로는 아닙니다.

내가 필요한 것은 URL, URL로 작성된 내용, 더 이상 아무것도, 전체 URL을 얻는 것입니다.

서버에서 파일의 실제 경로가 아니라 웹 브라우저의 탐색 표시 줄에 어떻게 나타나는지 알아야합니다.



답변

을 살펴보십시오 $_SERVER['REQUEST_URI']. 즉

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

(큰 따옴표로 묶인 문자열 구문은 완벽합니다. )

HTTP와 HTTPS를 모두 지원하려면

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

편집자 주 : 이 코드를 사용하면 보안에 영향을 미칩니다 . 클라이언트는 HTTP_HOST 및 REQUEST_URI를 원하는 임의의 값으로 설정할 수 있습니다.


답변

웹 페이지에서 링크를 출력하기위한 짧은 버전

$url =  "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
echo '<a href="' . $escaped_url . '">' . $escaped_url . '</a>';

//example.com/path/ 형식 의 문제 및 주요 사례에 대한 자세한 내용은 다음과 같습니다.

풀 버전

function url_origin( $s, $use_forwarded_host = false )
{
    $ssl      = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
    $sp       = strtolower( $s['SERVER_PROTOCOL'] );
    $protocol = substr( $sp, 0, strpos( $sp, '/' ) ) . ( ( $ssl ) ? 's' : '' );
    $port     = $s['SERVER_PORT'];
    $port     = ( ( ! $ssl && $port=='80' ) || ( $ssl && $port=='443' ) ) ? '' : ':'.$port;
    $host     = ( $use_forwarded_host && isset( $s['HTTP_X_FORWARDED_HOST'] ) ) ? $s['HTTP_X_FORWARDED_HOST'] : ( isset( $s['HTTP_HOST'] ) ? $s['HTTP_HOST'] : null );
    $host     = isset( $host ) ? $host : $s['SERVER_NAME'] . $port;
    return $protocol . '://' . $host;
}

function full_url( $s, $use_forwarded_host = false )
{
    return url_origin( $s, $use_forwarded_host ) . $s['REQUEST_URI'];
}

$absolute_url = full_url( $_SERVER );
echo $absolute_url;

이은 (는) 크게 수정 된 버전입니다 http://snipplr.com/view.php?codeview&id=2734.

URL 구조 :

scheme : // username : password @domain : port / path? query_string # fragment_id

굵게 표시된 부분은 기능에 포함되지 않습니다

노트:

  • 이 함수에는 username:password전체 URL 또는 조각 (해시)이 포함되지 않습니다 .
  • HTTP의 경우 기본 포트 80과 HTTPS의 경우 포트 443이 표시되지 않습니다.
  • http 및 https 체계에서만 테스트되었습니다.
  • #fragment_id클라이언트 (브라우저)에 의해 서버로 전송되지 않고 전체 URL에 추가되지 않습니다.
  • $_GETfoo=bar2와 같은 URL 만 포함 합니다 /example?foo=bar1&foo=bar2.
  • 일부 CMS 및 환경은 이 경우에 사용 하는 등의 URL을 다시 작성 $_SERVER['REQUEST_URI']하고 반환 /example?foo=bar2합니다 ./example?foo=bar1&foo=bar2$_SERVER['QUERY_STRING']
  • 것을 명심 URI는 = URL + URN하지만 인기있는 사용으로 인해, URL 지금 URI와 URL을 모두 의미한다.
  • HTTP_X_FORWARDED_HOST프록시 또는 밸런서를 사용하지 않으려면 제거 해야합니다.
  • 사양은 말한다 Host는 기본 번호가 아닌 헤더는 포트 번호를 포함해야합니다.

클라이언트 (브라우저) 제어 변수 :

  • $_SERVER['REQUEST_URI']. 지원되지 않는 문자는 보내기 전에 브라우저에서 인코딩합니다.
  • $_SERVER['HTTP_HOST']PHP 매뉴얼의 주석에 따라 항상 사용 가능한 것은 아닙니다 : http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST']밸런서에 의해 설정되며 $_SERVERPHP 매뉴얼 의 변수 목록에 언급되어 있지 않습니다 .

서버 제어 변수 :

  • $_SERVER['HTTPS']. 클라이언트는 이것을 사용하기로 선택하지만 서버는 실제 값을 비어 있거나 “on”으로 반환합니다.
  • $_SERVER['SERVER_PORT']. 서버는 허용 된 숫자 만 포트로 허용합니다.
  • $_SERVER['SERVER_PROTOCOL']. 서버는 특정 프로토콜 만 허용합니다.
  • $_SERVER['SERVER_NAME']. 서버 구성에서 수동으로 설정되며 kralyk 에 따라 IPv6에 사용할 수 없습니다 .

관련 :

HTTP_HOST 대 SERVER_NAME
은 HTTP “Host”헤더 매개 변수에 포트 번호가 필요합니까?
https://stackoverflow.com/a/28049503/175071


답변

예 : https://(www.)example.com/subFolder/myfile.php?var=blabla#555

// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname']      ? https://example.com/subFolder
$x['basename']     ?                               myfile.php?var=blabla#555 // Unsecure! 
$x['extension']    ?                                      php?var=blabla#555 // Unsecure! 
$x['filename']     ?                               myfile

// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme']       ? https
$x['host']         ?         example.com
$x['path']         ?                    /subFolder/myfile.php
$x['query']        ?                                          var=blabla
$x['fragment']     ?                                                     555

//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"]  ? /home/user/public_html
$_SERVER["SERVER_ADDR"]    ? 143.34.112.23
$_SERVER["SERVER_PORT"]    ? 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] ? https                                         //similar: $_SERVER["SERVER_PROTOCOL"] 
$_SERVER['HTTP_HOST']      ?         example.com (or with WWW)             //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"]    ?                       /subFolder/myfile.php?var=blabla
$_SERVER["QUERY_STRING"]   ?                                             var=blabla
__FILE__                   ? /home/user/public_html/subFolder/myfile.php
__DIR__                    ? /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    ?                       /subFolder/myfile.php?var=blabla
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)?  /subFolder/myfile.php
$_SERVER["PHP_SELF"]       ?                       /subFolder/myfile.php

// ==================================================================//
//if "myfile.php" is included in "PARENTFILE.php" , and you visit  "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]? /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"]       ?                       /parentfile.php
$_SERVER["REQUEST_URI"]    ?                       /parentfile.php?var=blabla
__FILE__                   ? /home/user/public_html/subFolder/myfile.php

// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' );            //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO'])  ...

//To trim values to filename, i.e. 
basename($url)             ? myfile.php

//excellent solution to find origin
$debug_files = debug_backtrace();
$caller_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;

공지! ! !

  • 해시 태그 #부분은 위의 예에서 설명 목적으로 만 수동으로 사용되었지만을 포함하여 서버 측 언어 php는 기본적으로이를 감지 할 수 없습니다 (해시 태그는 browser/client side기능성 이므로 Javascript 만 가능 ).
  • DIRECTORY_SEPARATOR\대신 Windows 유형 호스팅을 반환 합니다 /.


워드 프레스

//(let's say, if wordpress is installed in subdirectory:  http://example.com/wpdir/)
home_url()                      ? http://example.com/wpdir/        //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri()  ? http://example.com/wpdir/wp-content/themes/THEME_NAME  [same: get_bloginfo('template_url') ]
get_stylesheet_directory()      ? /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__)        ? http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__)       ? /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/  


답변

다음 은 코드를 최소화하면서 삼 항문을 사용하는 솔루션입니다 .

$url = "http" . (($_SERVER['SERVER_PORT'] == 443) ? "s" : "") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

웹 서버가 HTTPS에 표준 포트 443을 사용한다고 가정하면 가장 작고 쉬운 방법 입니다.


답변

현재 URL을 찾는 가장 좋아하는 크로스 플랫폼 방법은 다음과 같습니다.

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


답변

간단히 사용하십시오 :

$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']


답변

function full_path()
{
    $s = &$_SERVER;
    $ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
    $sp = strtolower($s['SERVER_PROTOCOL']);
    $protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
    $port = $s['SERVER_PORT'];
    $port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
    $host = isset($s['HTTP_X_FORWARDED_HOST']) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);
    $host = isset($host) ? $host : $s['SERVER_NAME'] . $port;
    $uri = $protocol . '://' . $host . $s['REQUEST_URI'];
    $segments = explode('?', $uri, 2);
    $url = $segments[0];
    return $url;
}

참고 : 방금 Timo Huovinen의 코드를 업데이트 했으므로 URL에 GET 매개 변수가 없습니다. 이 URL은 평범하며와 같은 것을 제거합니다 ?hi=i&am=a&get.

예:

http://www.example.com/index?get=information

다음과 같이 표시됩니다 :

http://www.example.com/index

특정 컨텐츠를 정의하기 위해 GET 매개 변수를 사용하지 않는 한 괜찮습니다.이 경우 그의 코드를 사용해야합니다! 🙂