이 코드를 사용하여 전체 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에 추가되지 않습니다. $_GET
foo=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']
밸런서에 의해 설정되며$_SERVER
PHP 매뉴얼 의 변수 목록에 언급되어 있지 않습니다 .
서버 제어 변수 :
$_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 매개 변수를 사용하지 않는 한 괜찮습니다.이 경우 그의 코드를 사용해야합니다! 🙂