Get the full URL in PHP
我使用此代码获取完整的URL:
1 | $actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']; |
问题是我在我的
我需要的是得到URL,写在URL中的内容,不多也不少完整的URL。
我需要了解它在Web浏览器的导航栏中的显示方式,而不是服务器上文件的实际路径。
看一下
1 | $actual_link ="http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; |
(请注意,双引号字符串语法完全正确)
如果要同时支持HTTP和HTTPS,可以使用
1 | $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ?"https" :"http") ."://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; |
编者按:使用此代码具有安全含义。客户机可以设置http_主机并请求u uri到任何它想要的任意值。
网页上的短版本到输出链接
1 2 3 4 | $url = "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"; $escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' ); echo '' . $escaped_url . ''; |
以下是有关//example.com/path/格式的问题和边缘案例的更多详细信息
完整版1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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; |
这是
scheme://username:password@domain:port/path?查询字符串片段ID
粗体部分不包含在功能中
笔记:- 此函数不包括来自完整URL或片段(哈希)的
username:password 。 - 它不会显示HTTP的默认端口80和HTTPS的端口443。
- 仅使用HTTP和HTTPS方案进行测试。
#fragment_id 不是由客户机(浏览器)发送到服务器的,也不会添加到完整的URL中。- 对于像
/example?foo=bar1&foo=bar2 这样的URL,$_GET 只包含foo=bar2 。 - 有些CMS和环境会重写
$_SERVER['REQUEST_URI'] ,并返回/example?foo=bar2 ,对于类似/example?foo=bar1&foo=bar2 的URL,在这种情况下使用$_SERVER['QUERY_STRING'] 。 - 请记住,uri=
URL + URN ,但由于广泛使用,url现在意味着uri和url。 - 如果不打算使用代理或平衡程序,则应删除
HTTP_X_FORWARDED_HOST 。 - 规范指出,除非是默认编号,否则
Host 头必须包含端口号。
客户端(浏览器)控制变量:
$_SERVER['REQUEST_URI'] 。任何不支持的字符在发送前都由浏览器进行编码。- 根据php手册:http://php.net/manual/en/reserved.variables.php中的注释,
$_SERVER['HTTP_HOST'] 并不总是可用的。 $_SERVER['HTTP_X_FORWARDED_HOST'] 由平衡程序设置,在PHP手册的$_SERVER 变量列表中没有提到。
服务器控制变量:
$_SERVER['HTTPS'] 。客户机选择使用它,但是服务器返回空值或"on"值。$_SERVER['SERVER_PORT'] 。服务器只接受允许的数字作为端口。$_SERVER['SERVER_PROTOCOL'] 。服务器只接受某些协议。$_SERVER['SERVER_NAME'] 。它是在服务器配置中手动设置的,根据Kralyk,它不可用于IPv6。
相关:
HTTP主机与服务器名称HTTP"主机"头参数中是否需要端口号?https://stackoverflow.com/a/28049503/175071
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | // ======= PATHINFO ====== // $x = pathinfo($url); $x['dirname'] ?? https://example.com/subFolder $x['basename'] ?? myfile.php? $x['extension'] ?? php?k=blaa#12345 // Unsecure! also, read my notice about hashtag parts $x['filename'] ?? myfile // ======= PARSE_URL ====== // $x = parse_url($url); $x['scheme'] ?? https $x['host'] ?? example.com $x['path'] ?? /subFolder/myfile.php $x['query'] ?? k=blaa $x['fragment'] ?? 12345 // ! read my notice about hashtag parts //=================================================== // //========== 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?k=blaa $_SERVER["QUERY_STRING"] ?? k=blaa __FILE__ ?? /home/user/public_html/subFolder/myfile.php __DIR__ ?? /home/user/public_html/subFolder //same: dirname(__FILE__) $_SERVER["REQUEST_URI"] ?? /subFolder/myfile.php?k=blaa 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?abc __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(服务器端)检测hashtag(…)url部分。为此,请使用javascript。
DIRECTORY_SEPARATOR 返回windows类型主机的\ ,而不是/ 。
< BR>
WordPress1 2 3 4 5 6 | //(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/ |
下面是一个使用三元语句的解决方案,使代码最少:
1 | $url ="http" . (($_SERVER['SERVER_PORT'] == 443) ?"s" :"") ."://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; |
这是实现这一点的最小和最简单的方法,假设您的Web服务器使用标准端口443进行HTTPS。
我最喜欢的跨平台查找当前URL的方法是:
1 |
简单使用:
1 | $uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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"。
例子:
1 | http://www.website.com/index?get=information |
将显示为:
1 | http://www.website.com/index |
除非您使用GET定义某些特定的内容,否则请使用他的代码!-)
清除代码,在所有Web服务器(Apache、nginx、iis等)中工作:
1 | $url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; |
这是我的解决方案-代码是受Tracy调试器的启发。为了支持不同的服务器端口,它进行了更改。您可以获得完整的当前URL,包括
1 2 3 4 5 6 7 8 9 10 | 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); } } |
以下是测试代码:
1 2 3 4 5 6 7 8 9 10 11 | // 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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(如果您没有访问pecl_http附带的http_build_url()):
1 | $url = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://').$_SERVER['SERVER_NAME'].str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(dirname(__FILE__))); |
与公认答案相同的技术,但支持HTTPS,并且可读性更强:
1 2 3 4 5 6 |
HTTP_HOST and REQUEST_URI must be in quotes, otherwise it throws an error in PHP 7.2
用途:
1 | $actual_link = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
如果要同时支持HTTP和HTTPS:
1 | $actual_link = (isset($_SERVER['HTTPS']) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; |
我让这个类处理我的URI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 | <?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(); } |
当然,你必须使它适应你的需求和系统!?!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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 '[cc lang="php"]'; var_dump(_URI::Extract()); echo ' |
;//分别输出提取的段echo'方案:'.u uri::segment('scheme').'
';echo'用户:'.u uri::segment('user').'
';echo'密码:'.u uri::segment('passwd').'
';echo'主机:'.u uri::segment('host').'
';echo'端口:'.u uri::segment('port').'
';echo'路径:'.u uri::segment('path').'
';echo'脚本:'.u uri::segment('script').'
';echo'信息:'.u uri::segment('info').'
';//将提取的段编译为可用的URL回声'BR/>;echo"完全编译的URI:'.u uri::compile()'
';回声'BR/>;//输出预编译的公共基,以获得更快的结果和更好的性能echo'主机基:'.u uri::base('host').'
';echo'应用程序基:'.u uri::base('app').'
';echo'正在运行的脚本:'.u uri::base('script').'
';echo'当前URI基:'.u uri::base('current').'
';echo'公用文件夹基:'.u uri::base('public').'
';echo'外观文件夹基:'.u uri::base('skin').'
';//获取关联数组中的所有预编译基回声"
1 2 3 | '; var_dump(_URI::Base('All')); echo ' |
";//分析一个示例字符串,并用实际的URI数据替换已知的键。echo _uri::parse('这是我当前的域:%hostbase%当前应用程序在这里:%appbase%我加载皮肤表单:%skinBase%等。"";< /代码>
它仍然需要完善,但对于一个集中式的URI系统来说,它是一个上帝的解决方案:d
使用Apache环境变量很容易做到这一点。这只适用于Apache2,我假设您正在使用它。
只需使用以下PHP代码:
1 2 3 4 | <?php $request_url = apache_getenv("HTTP_HOST") . apache_getenv("REQUEST_URI"); echo $request_url; ?> |
试试这个:
1 |
您可以使用不带参数的http_build_url获取当前页面的完整url:
1 |
这是解决您问题的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //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; |
我用了这句话。
1 2 |
我希望这对你有帮助。
我已经使用了下面的代码,对于HTTP和HTTPS这两种情况,它都可以正常工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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(); |
演示
1 2 3 4 5 6 7 8 9 | public static function getCurrentURL() { $protocol = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') === false ? 'http' : 'https'; $host = $_SERVER['HTTP_HOST']; $script = $_SERVER['SCRIPT_NAME']; $params = $_SERVER['QUERY_STRING'] == '' ? '' : '?' . $_SERVER['QUERY_STRING']; return $protocol . '://' . $host . $script . $params; } |
您可以使用
1 2 3 4 5 | if ( ! array_key_exists( 'HTTP_ORIGIN', $_SERVER ) ) { $this->referer = $_SERVER['SERVER_NAME']; } else { $this->referer = $_SERVER['HTTP_ORIGIN']; } |
非常简单的使用:
1 2 3 4 5 6 7 | function current_url() { $current_url = ( $_SERVER["HTTPS"] != 'on' ) ? 'http://'.$_SERVER["SERVER_NAME"] : 'https://'.$_SERVER["SERVER_NAME"]; $current_url .= ( $_SERVER["SERVER_PORT"] != 80 ) ?":".$_SERVER["SERVER_PORT"] :""; $current_url .= $_SERVER["REQUEST_URI"]; return $current_url; } |
下面是使用php的filter_input函数获得更安全版本的公认答案的基础,这也弥补了
1 2 3 4 5 6 7 8 9 10 11 12 13 | $protocol_https = filter_input(INPUT_SERVER, 'HTTPS', FILTER_SANITIZE_STRING); $host = filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL); $request_uri = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL); if(strlen($request_uri) == 0) { $request_uri = filter_input(INPUT_SERVER, 'SCRIPT_NAME', FILTER_SANITIZE_URL); $query_string = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_URL); if($query_string) { $request_uri .= '?' . $query_string; } } $full_url = ($protocol_https ? 'https' : 'http') . '://' . $host . $request_uri; |
你可以使用一些不同的过滤器来调整你的喜好。
1 2 3 4 5 6 7 8 9 10 | $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
我觉得这个方法很好,试试看
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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'] . '/images/'); } 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'] . '/images/'); } |
这对HTTP和HTTPS都有效。
1 | echo 'http' . (($_SERVER['HTTPS'] == 'on') ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; |
输出类似的内容。
https://example.com/user.php?token=3f0d9sickc0flmg8hnsngk5u07&access_level=application
1 | $page_url = (isset($_SERVER['HTTPS']) ?"https" :"http") ."://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; |
了解更多:如何使用PHP获取页面的完整URL