【问题标题】:Get the full URL in PHP获取 PHP 中的完整 URL
【发布时间】:2011-10-09 18:34:12
【问题描述】:

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

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

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

我需要的是获取 URL,写在 URL 中的内容,不多也不少——完整的 URL。

我需要知道它在网络浏览器导航栏中的显示方式,而不是服务器上文件的真实路径。

【问题讨论】:

  • @Brade URL 栏在用户浏览器上,那么为什么 PHP 会有任何相关功能呢? PHP 是服务器端。
  • @eis 相信我,有很多理由想要这个。使用相同模板但需要单独跟踪的登陆页面等。事实是 PHP(或任何服务器端语言)可以返回 URL 的所有各个部分,但似乎永远不会在一个字符串中提供全部内容.它看起来很愚蠢。
  • 整个东西永远不会发送到服务器端,因为它不重要,这就是它在任何地方都不容易获得的原因。我会认为任何依赖于该损坏的功能。但是,这只是我的意见。
  • 我上面的示例需要一个自我 URL:“填充 FORM 操作 URL”可能是错误的,因为 PHP_SELF(仅路径,无域等)应该足够了。但这并不一定意味着规范自我 URL 的所有其他需求都是无效的。如果确实如此,那么很高兴看到详尽的解释,为什么。
  • 你不应该在配置中硬编码你的 URL 的原因之一是当你有不同的平台来安装你的项目时(开发、集成、生产)。它们中的每一个都有其特定的 URL,并且您不想根据安装项目的服务器来更改代码。

标签: php url


【解决方案1】:

看看$_SERVER['REQUEST_URI'],即

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

(注意双引号的字符串语法是perfectly correct

如果你想同时支持 HTTP 和 HTTPS,你可以使用

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

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

【讨论】:

  • 如果您使用的是 https 链接怎么办?如果 HTTP_HOST 不可用或被客户端篡改怎么办?这个答案似乎不完整且不可靠。
  • 你无能为力,这是解决问题的正确方法。
  • 你可以只添加HTTPS的检查:'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}/{$_SERVER['REQUEST_URI']}"
  • 如果您将 URL 作为链接输出到浏览器,只需关闭 http:。见:stackoverflow.com/questions/4978235
  • 这些来自双方的cmet不再对原帖做出贡献,不增加价值。添加评论的工具提示指出“使用 cmets 询问更多信息或提出改进建议”。请坚持下去。
【解决方案2】:

在网页上输出链接的短版

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

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

以下是有关the //example.com/path/ format 的问题和边缘案例的更多详细信息

完整版

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 的大量修改版本(现已不存在)

网址结构:

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

粗体部分不包含在函数中

注意事项:

  • 此函数不包括来自完整 URL 或片段(哈希)的username:password
  • 它不会显示 HTTP 的默认端口 80 和 HTTPS 的端口 443。
  • 仅使用 http 和 https 方案进行测试。
  • #fragment_id 不会由客户端(浏览器)发送到服务器,也不会添加到完整的 URL。
  • $_GET 将仅包含 foo=bar2 用于类似 /example?foo=bar1&amp;foo=bar2 的 URL。
  • 某些 CMS 和环境将重写 $_SERVER['REQUEST_URI'] 并为类似 /example?foo=bar1&amp;foo=bar2 的 URL 返回 /example?foo=bar2,在这种情况下使用 $_SERVER['QUERY_STRING']
  • 请记住,URI = URL + URN,但由于普遍使用,现在 URL 既指 URI 又指 URL。
  • 如果您不打算使用代理或平衡器,则应删除 HTTP_X_FORWARDED_HOST
  • spec 表示Host 标头必须包含端口号,除非它是默认端口号。

客户端(浏览器)控制变量:

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

服务器控制变量:

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

相关:

What is the difference between HTTP_HOST and SERVER_NAME in PHP?
Is Port Number Required in HTTP "Host" Header Parameter?
https://stackoverflow.com/a/28049503/175071

【讨论】:

  • 如果服务器由 IPv6 IP 地址提供,此代码将失败。要解决此问题,请将 SERVER_NAME 替换为 HTTP_HOST。
  • 注意:$_SERVER['REQUEST_URI'] 将显示/example?foo=bar2 用于类似/example?foo=bar1&amp;foo=bar2 的网址
  • 这不会包含任何在 # 之后定义的内容,这些不会传递到服务器
  • 我不确定这是否没有安全风险。在您的示例中,您可以发送 Host 标头以到达正确的页面,但可能会让页面认为它是通过使用 HTTP_X_FORWARDED_HOST 标头的另一个主机调用的。当应用程序使用此信息(无论出于何种目的)时,它确实可能是一个安全问题,因为它允许您承诺一些并非如此的事情。
  • @Matt3o12 端口的值直接取自Host头,没见过这样设置的,谢谢提及,会加个微调
【解决方案3】:

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

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

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

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

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

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

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

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

注意! ! !

  • 标签# 部分在上面的示例中手动使用只是为了说明目的,但是,服务器端语言(包括php)不能本地检测它们(只有Javascript可以做到这一点,因为标签只有@ 987654326@ 功能)。
  • DIRECTORY_SEPARATOR 对于 Windows 类型的主机返回 \,而不是 /


对于 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/  

【讨论】:

  • #部分在哪里,服务器端#后面的部分我们无法访问吗?
  • @RohitKhatri 该部分只能在浏览器中访问,不会发送到服务器
  • 什么是wordpress函数也可以获取带有查询字符串的url?
  • 警告:pathinfo() 不会像您期望的那样处理更复杂的URL - 尽管/ 字符在参数中没有被严格禁止(请参阅stackoverflow.com/questions/1455578/…),解析这样的URL不会给你脚本基名/文件名。试试print_r(pathinfo("https://example.com/subFolder/myfile.php?var=path/to/another/file.png"));
【解决方案4】:
    public static function getCurrentUrl($withQuery = true)
    {
        $protocol = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
        or (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
        or (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
        or (isset($_SERVER['SERVER_PORT']) && intval($_SERVER['SERVER_PORT']) === 443) ? 'https' : 'http';

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

        return $withQuery ? $uri : str_replace('?' . $_SERVER['QUERY_STRING'], '', $uri);
    }

【讨论】:

  • 似乎工作得很好,但我不得不用 ors 替换 ||
【解决方案5】:
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's code,因此您不会在 URL 中获得任何 GET 参数。此 URL 很简单,并删除了 ?hi=i&amp;am=a&amp;get 之类的内容。

例子:

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

将显示为:

http://www.example.com/index

这很好,除非你使用 GET 参数来定义一些特定的内容,在这种情况下你应该使用他的代码! :-)

【讨论】:

  • 嘿,这很酷 :) 您还可以删除哈希“#”(网址片段)之后的任何内容,以防它以某种方式滑入
  • 不是真的,因为如果你在“explode('#',$segment[0])”中设置,会被认为是错误,因为“#”符号破坏了URL,并且只能被Javascript读取。但是,可以肯定的是,您可以使用“return trim($url,'#');”重新制作“return $url;”,因为这样您将删除它,以防它存在.但它不会删除以下内容。如果您愿意,可以阅读“Parse_url”。 :-)
【解决方案6】:
$page_url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

更多信息:How to get the full URL of a page using PHP

【讨论】:

  • 这个答案是从上面复制的。
【解决方案7】:

HTTP_HOST 和 REQUEST_URI 必须用引号引起来,否则在 PHP 7.2 中会抛出错误

用途:

$actual_link = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

如果你想同时支持 HTTP 和 HTTPS:

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

【讨论】:

    【解决方案8】:

    这里是接受答案的更安全版本的基础,使用 PHP 的filter_input 函数,这也弥补了$_SERVER['REQUEST_URI'] 的潜在不足:

    $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;
    

    您可以使用一些不同的filters 来根据自己的喜好对其进行调整。

    【讨论】:

      【解决方案9】:

      这是一个使用ternary statement 的解决方案,保持代码最少:

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

      这是执行此操作的最小且最简单的方法,假设您的 Web 服务器使用标准端口 443 连接HTTPS

      【讨论】:

      • 或者使用$_SERVER["HTTPS"] == "on"来检查SSL是否开启。
      • 您应该使用 $_SERVER["HTTPS"] 因为端口 443 只是默认的 SSL 端口,而不是 SSL 指示符。
      • @AlexBarker - 这就是为什么我说“假设一个网络服务器使用标准端口 443 进行 HTTPS。”
      【解决方案10】:

      非常简单的使用:

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

      【讨论】:

      • 您好,鉴于此页面上已经有多少个答案,您能否解释一下为什么它比其他的更好,或者它有什么不同?
      • 嗨,确实有很多解决方案,我的功能简单、干净、易于理解。
      【解决方案11】:

      您可以使用HTTP_ORIGIN,如下面的sn-p所示:

      if ( ! array_key_exists( 'HTTP_ORIGIN', $_SERVER ) ) {
          $this->referer = $_SERVER['SERVER_NAME'];
      } else {
          $this->referer = $_SERVER['HTTP_ORIGIN'];
      }
      

      【讨论】:

        【解决方案12】:
        $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. 
        

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

        【讨论】:

          【解决方案13】:

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

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

          【讨论】:

          • 你混合 url 和文件在磁盘上的绝对位置
          【解决方案14】:

          简单使用:

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

          【讨论】:

          • 尽管我想使用它,但它在 IIS 中不起作用。 stackoverflow.com/questions/18008135/…
          • 它输出什么?
          • PHP 注意:未定义索引:REQUEST_SCHEME
          • 我喜欢这个解决方案!但是你也可以让它适用于 nginx 吗?
          • http://example.com :8080 /request.php 并失败。这些答案很复杂是有原因的。
          【解决方案15】:

          我使用了下面的代码,它对我来说工作正常,对于 HTTP 和 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();
          

          Demo

          【讨论】:

          • http和https的互换位置
          • 除非我记错了,$_SERVER['HTTPS'] = 'off' 会触发 HTTPS 路径。这似乎不对。另一方面,我也不认为原来的逻辑是对的。
          【解决方案16】:

          这适用于 HTTP 和 HTTPS。

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

          输出类似这样的内容。

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

          【讨论】:

            【解决方案17】:

            代码清晰,适用于所有网络服务器(Apache、nginx、IIS...):

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

            【讨论】:

              【解决方案18】:

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

              $url = http_build_url();
              

              【讨论】:

              • 请注意,http_build_url() 只是一个 PECL 函数:(PECL pecl_http >= 0.21.0)
              【解决方案19】:

              我觉得这个方法不错..试试吧

              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/');
              }
              

              【讨论】:

                【解决方案20】:

                试试这个:

                print_r($_SERVER);
                

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

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

                【讨论】:

                  【解决方案21】:

                  我用了这个说法。

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

                  希望对你有帮助。

                  【讨论】:

                    【解决方案22】:

                    我已经制作了这个函数来处理 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;
                         }
                     ?>
                    

                    【讨论】:

                      【解决方案23】:

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

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

                      【讨论】:

                        【解决方案24】:

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

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

                        【讨论】:

                        • 关闭,但我需要将其更改为: $url = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? “https”:“http”)。 "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
                        【解决方案25】:

                        我已经创建了这个类来处理我的 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();
                        } 
                        

                        当然你必须让它适应你的需求和系统!?!

                        <?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.
                        '); 
                        

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

                        【讨论】:

                          【解决方案26】:

                          这是您问题的解决方案:

                          //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;
                          

                          【讨论】:

                            【解决方案27】:

                            这是我的解决方案 - 代码灵感来自 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);
                                }
                            }
                            

                            这里是测试代码:

                            // 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/
                            

                            【讨论】:

                            • 注意:http_build_url 需要安装 pecl_http
                            【解决方案28】:

                            使用 Apache 环境变量很容易做到这一点。这仅适用于我假设您正在使用的 Apache 2。

                            只需使用以下 PHP 代码:

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

                            【讨论】:

                            • 我试过这个 $actual_link = 'http' 。 (isset($_SERVER['HTTPS']) ? 's' : '') 。 '://' 。 "{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-05-29
                            • 2011-07-31
                            • 1970-01-01
                            • 2023-03-29
                            • 2011-01-15
                            • 2017-04-22
                            相关资源
                            最近更新 更多