获取PHP中的完整URL

Die*_*oP. 978 php url

我使用此代码获取完整的URL:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
Run Code Online (Sandbox Code Playgroud)

问题是我在我.htaccess身上使用了一些掩码,所以我们在URL中看到的并不总是文件的真实路径.

我需要的是获取URL,URL中写的内容,仅此而已 - 完整的URL.

我需要了解它在Web浏览器的导航栏中的显示方式,而不是服务器上文件的真实路径.

ax.*_*ax. 1931

看看$_SERVER['REQUEST_URI'],即

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
Run Code Online (Sandbox Code Playgroud)

(请注意,双引号字符串语法完全正确)

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

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

编者注:使用此代码具有安全隐患.客户端可以将HTTP_HOST和REQUEST_URI设置为它想要的任意值.

  • 你可以添加HTTPS的检查:''http'.(isset($ _ SERVER ['HTTPS'])?'s':'').'://'."{$ _SERVER [ 'HTTP_HOST']}/{$ _ SERVER [ 'REQUEST_URI']}"` (179认同)
  • 如果您使用的是https链接怎么办?如果HTTP_HOST不可用或被客户端篡改怎么办?这个答案似乎不完整且不可靠. (132认同)
  • 这个答案并不完全正确 - 架构可能是https (22认同)
  • 你可以做的不多,这是问题的正确方法. (20认同)
  • 如果您将URL作为链接输出到浏览器,只需将http:关闭即可.请参阅:http://stackoverflow.com/questions/4978235/ (6认同)
  • @斧头.而且你认为你比我多一点?哈哈好朋友 如果您在回复答案时滥用主持人工具而没有足够强烈地表现出您的傲慢,那么它肯定在这里展示得足够多了; 从而诋毁你不得不说的其他一切.另外,我不会误解任何事情(你知道他们对假设的看法......),我确切知道你在做什么,这不是好习惯. (5认同)
  • 双方的这些评论不再对原始帖子做出贡献,也不会增加价值.添加注释的工具提示状态"使用注释来询问更多信息或建议改进".请坚持下去. (4认同)
  • 哇这个答案很可怕 - 涉及不必要的可疑编码标准,与问题无关 - 甚至还有重要的错误.我建议读者看看其他高分的答案. (4认同)
  • 这是缺少索引周围的引号.应该是`$ _SERVER ['HTTP_HOST']` (3认同)
  • @mattryan不是 - 在我的答案结尾处看到"完全正确"的链接(特别是示例). (3认同)
  • 请注意,当ISAPI与IIS一起使用时,如果请求不是通过HTTPS协议进行的,则值'$ _SERVER ['HTTPS']`将为'off`. (3认同)
  • @斧头.那么请告诉我这句语法不正确:$ var ="http:// {$ _SERVER ['HTTP_HOST']} {$ _SERVER ['REQUEST_URI']}"; 我发现该语法没有错误.但是(你的语法):$ var ="http:// $ _ SERVER [HTTP_HOST] $ _SERVER [REQUEST_URI]"; 将抛出E_NOTICE级错误. (3认同)
  • @Meogi试试这个:`error_reporting(-1); $ _SERVER ['HTTP_HOST'] ='example.com'; echo"$ _SERVER [HTTP_HOST]"; //注意$ _SERVER [HTTP_HOST]包含在"s!`中 (3认同)
  • @斧头.有趣.好吧,我的意思是没有不尊重这一切,现在是时候说你是对的了.谢谢你,先生,我今天确实学到了新的东西.我会留下你的帖子. (3认同)
  • @斧头.然而,在采用编码_standards_的许多地方都不鼓励你的语法.不应该鼓励初级开发人员省略封闭的引号,因为它可以和_has_(根据我的经验)产生不良习惯.这就是为什么编码标准通常会说,当你做某件事时,它并不总是意味着它是最好甚至_好的做法.我休息我的情况说,最后,编辑版本仍然比你的版本更好. (3认同)
  • @ivkremer,我认为你在`{$ _SERVER ['HTTP_HOST']}`和`{$ _SERVER ['REQUEST_URI']}之间有一个超级斜线. (3认同)
  • 使用与`$ _SERVER [HTTP_HOST]`相同的方式添加域名 - 请参阅我的更新答案. (2认同)
  • @ MatthewT.Baker` $ _SERVER ['REQUEST_SCHEME']`不可靠 - 请参阅http://stackoverflow.com/questions/18008135/is-serverrequest-scheme-reliable (2认同)
  • @斧头。关于您在13年8月23日17:21发表的评论。您引用的文档中明确指出您的原始语法不正确。以下是您链接页面上php.net上的粘贴信息://这是错误的,原因与$ foo [bar]在字符串外错误相同。//换句话说,它仍然会起作用,但这只是因为PHP首先会查找一个名为foo的常量;将引发// E_NOTICE级错误(未定义的常量)。回声“这是错误的:{$ arr [foo] [3]}”;现在,请停止传播不正确的信息。 (2认同)
  • @Meogi我一直在恢复您的编辑,因为它们不必要地冗长,我的版本没有抛出E_NOTICE错误,这是我的答案.Re:"您的原始语法不正确":您正在查看并引用我引用的简单字符串语法文档的错误部分.所以让我为你做:"他喝了一些果汁[koolaid1]果汁."` 你知道koolaid1周围没有引号吗?所以我会继续将你的编辑恢复为第3次(希望是最后一次). (2认同)
  • @mmmshuddup我对这段经历的假设是基于我们的年龄(我41岁),我们都做编程的时间(我自1987年以来),以及我们的stackoverflow历史.随意纠正我.但请注意事实,例如,请指出一些"许多地方采用的编码标准",这会阻碍我的语法,给我一些具体的论据,为什么你认为你的语法更好 - 但不要个人化.谢谢! (2认同)
  • 我想知道为什么没有人提到协议相关的“//urls”?它解决了 http 和 https 的所有问题 (2认同)
  • @vladkras `//` 如何解决将当前页面的完整 URL 放入电子邮件的问题?仅供初学者使用:) (2认同)
  • 这是考虑服务器端口:`$ protocol ='http'.(isset($ _ SERVER ['HTTPS'])?'s':''); $主机= "{$ _ SERVER [ 'HTTP_HOST']}"; $ port =(($ _ SERVER ['SERVER_PORT']!= 80 || $ _SERVER ['SERVER_PORT']!= 443)?"":":".$ _SERVER ['SERVER_PORT']); $ REQUEST_URI = "{$ _ SERVER [ 'REQUEST_URI']}"; $ server_url = $ protocol.'://'.$ host.$port.$request_uri; ` (2认同)
  • @Decoded 因为 `$_SERVER['SCRIPT_URI']` [仅在启用 mod_rewrite 时可用](http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#EnvVar)。 (2认同)
  • 嘿,编辑。如果使用 HTTP_HOST 有安全隐患,那么哪种方法是安全的?你不说。 (2认同)

Tim*_*nen 406

短版本输出网页上的链接

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

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

以下是有关//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;
Run Code Online (Sandbox Code Playgroud)

这是一个经过大量修改的版本http://snipplr.com/view.php?codeview&id=2734.

网址结构:

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和环境将重写$_SERVER['REQUEST_URI']并返回/example?foo=bar2URL,例如/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'].客户端选择使用它,但服务器返回空或"开"的实际值.
  • $_SERVER['SERVER_PORT'].服务器仅接受允许的数字作为端口.
  • $_SERVER['SERVER_PROTOCOL'].服务器只接受某些协议.
  • $_SERVER['SERVER_NAME'].它是在服务器配置中手动设置的,根据kralyk不适用于IPv6 .

有关:

HTTP_HOST与SERVER_NAME
是HTTP"主机"标头参数中是否需要端口号?
/sf/answers/1963465241/

  • 如果服务器由IPv6 IP地址给出,则此代码将失败.要解决此问题,请将SERVER_NAME替换为HTTP_HOST. (13认同)
  • 这不包含#之后定义的任何内容,它们不会传递给服务器 (2认同)

T.T*_*dua 217

URL的示例: https://(www.)example.com/subFolder/myfile.php?var=blabla#555

// ======= 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__;
Run Code Online (Sandbox Code Playgroud)

注意!:

  • DIRECTORY_SEPARATOR返回\Windows类型的托管,而不是/.
  • 请记住,https://(www.)example.com/subFolder/myfile.php?var=blabla#555在URL(如DIRECTORY_SEPARATOR\)之后的部分无法通过SERVER-SIDE语言(如PHP,因此 /无法看到)检测到,而是必须使用JavaScript.(顺便说一句,可能你根本不需要在php中).

对于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/  
Run Code Online (Sandbox Code Playgroud)


hon*_*ovk 62

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

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

假设一个人的Web服务器使用HTTPS的标准端口443,这是最小和最简单的方法.

  • 或者使用`$ _SERVER ["HTTPS"] =="on"`检查SSL是否开启. (18认同)
  • 您应该使用$ _SERVER ["HTTPS"],因为端口443只是默认的SSL端口,而不是SSL指示器. (14认同)
  • @AlexBarker - 这就是为什么我说"假设一个人的网络服务器使用标准的端口443进行HTTPS". (3认同)

Dan*_*pie 44

我最喜欢的用于查找当前URL的跨平台方法是:

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

  • 关闭,但我需要将其更改为:$ url =((isset($ _ SERVER ['HTTPS'])&& $ _SERVER ['HTTPS']!=='off')?"https":"http") .":// $ _ SERVER [HTTP_HOST] $ _SERVER [REQUEST_URI]"; (6认同)

Hap*_*der 32

只需使用:

$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
Run Code Online (Sandbox Code Playgroud)

  • PHP注意:未定义的索引:REQUEST_SCHEME (5认同)
  • `http://example.com` **`:8080`** `/request.php` 并失败。这些答案之所以复杂是有原因的。 (2认同)

Ale*_*ard 20

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;
}
Run Code Online (Sandbox Code Playgroud)

注意:我刚刚对"Timo Huovinen"代码进行了更新,因此您不会在URL中获得任何内容.这个网址很简单,删除了"?hi = i&am = a&get"之类的内容.

例:

http://www.example.com/index?get=information
Run Code Online (Sandbox Code Playgroud)

将显示为:

http://www.example.com/index
Run Code Online (Sandbox Code Playgroud)

除非您使用Get来定义某些特定内容,否则请使用他的代码!:-)


And*_*eas 17

清除代码,适用于所有Web服务器(Apache,nginx,IIS,...):

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


Ozz*_*ech 11

这是我的解决方案 - 代码的灵感来自Tracy Debugger.它被更改为支持不同的服务器端口.您可以获取完整的当前URL,包括$_SERVER['REQUEST_URI']基本服务器URL.检查我的功能:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是测试代码:

// 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/
Run Code Online (Sandbox Code Playgroud)


小智 9

我已经使用此函数来处理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;
     }
 ?>
Run Code Online (Sandbox Code Playgroud)


Jon*_*ill 9

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

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


Kai*_*ack 8

HTTP_HOST和REQUEST_URI必须在引号中,否则会在PHP 7.2中引发错误

使用:

$actual_link = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
Run Code Online (Sandbox Code Playgroud)

如果要同时支持HTTP和HTTPS:

$actual_link = (isset($_SERVER['HTTPS']) ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
Run Code Online (Sandbox Code Playgroud)


小智 7

使用此单行查找父文件夹URL(如果您无权访问pecl_http附带的http_build_url()):

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

  • 你将url和文件绝对位置混合在磁盘上 (4认同)

小智 6

这对您的Apache环境变量来说非常容易.这仅适用于Apache 2,我假设您正在使用它.

只需使用以下PHP代码:

<?php
    $request_url = apache_getenv("HTTP_HOST") . apache_getenv("REQUEST_URI");
    echo $request_url;
?>
Run Code Online (Sandbox Code Playgroud)


php*_*per 6

试试这个:

print_r($_SERVER);
Run Code Online (Sandbox Code Playgroud)

$_SERVER是一个包含标题,路径和脚本位置等信息的数组.此阵列中的条目由Web服务器创建.无法保证每个Web服务器都能提供这些服务; 服务器可以省略一些,或提供此处未列出的其他服务器.也就是说,在»CGI/1.1规范中考虑了大量这些变量,因此您应该能够期待这些变量.

$HTTP_SERVER_VARS包含相同的初始信息,但不是超全局.(注意,$HTTP_SERVER_VARS并且$_SERVER是不同的变量,PHP会这样处理它们)


Luk*_*sna 6

您可以使用不带参数的http_build_url来获取当前页面的完整URL:

$url = http_build_url();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,http_build_url()仅是PECL函数:(PECL pecl_http> = 0.21.0) (5认同)

San*_*lin 5

我已经让这个类来处理我的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();
} 
Run Code Online (Sandbox Code Playgroud)

当然,你必须根据自己的需求和系统进行调整!?!

<?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.
'); 
Run Code Online (Sandbox Code Playgroud)

它仍然需要完善,但它是集中式URI系统的神解决方案:D


Vai*_*ain 5

这是您的问题的解决方案:

//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;
Run Code Online (Sandbox Code Playgroud)