【问题标题】:How to generate absolute URL path to a script file?如何生成脚本文件的绝对 URL 路径?
【发布时间】:2011-06-28 18:42:16
【问题描述】:

这和this几乎是同一个问题

我需要获取脚本的绝对网址。 比如我有这个结构

http://mydomain.com/downloads/games/freegame_222/ajax.php

我的应用程序根目录位于 freegame_222/

但是,我怎样才能“构建”绝对路径,而不是 ajax.php 的相对路径? 结果将是

http://mydomain.com/downloads/games/freegame_222/ajax.php

/downloads/games/freegame_222/ajax.php

但不是:

ajax.php

这些示例将在调用url("ajax.php"); 后返回

PHP 中是否有针对它的本机函数?如果没有,有人知道任何定制的吗?

编辑:

我想从另一个页面调用那个页面,例如 index.php

【问题讨论】:

  • 注意:根据服务器的配置,$_SERVER['SERVER_NAME'] 可能不会提供 mydomain.com。改用 $_SERVER['HTTP_HOST']

标签: php function absolute-path


【解决方案1】:

parse_url() 函数可能会满足您的需求:

$url = 'http://mydomain.com/downloads/games/freegame_222/ajax.php';

$path = parse_url($url, PHP_URL_PATH);

这是来自the manual page的更完整示例:

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_PATH);
?>

上面的例子会输出:

大批 ( [方案] => http [主机] => 主机名 [用户] => 用户名 [通过] => 密码 [路径] => /路径 [查询] => arg=值 [片段] => 锚点 ) /小路

【讨论】:

  • 你试过了吗?你的第一个例子?它确实返回 /downloads/games/freegame_222/ajax.php ...我需要 /downloads/games/freegame_222/ 或 mydomain.com/downloads/games/freegame_222
  • 我认为您需要编辑您的 OP。这不是您在问题中指定的内容。
  • Result will be: http://mydomain.com/downloads/games/freegame_222/ajax.php or /downloads/games/freegame_222/ajax.php
  • 你要求/downloads/games/freegame_222/ajax.php,我提供的代码给你/downloads/games/freegame_222/ajax.php,但你说我没有给你你想要的。或许你能理解我的困惑。
【解决方案2】:

与 George Cummins 的回答类似,只需执行以下操作:

$path = $_SERVER['SERVER_NAME'] . '/' . $_SERVER['REQUEST_URI'];

这应该会给你完整的路径。现在,如果您想从另一个页面获取它,有什么理由让它动态生成 url?为什么你不能只使用绝对路径,或者如果有的话,$_SERVER['SERVER_NAME'] + 路径的其余部分,这样它就可以在域/主机之间工作。

【讨论】:

  • 我不能只用那个绝对路径,因为如果你在做开源,你不知道 url 是什么,并且如果你需要包含一个标题(它会喜欢包含css/default.css) 不能再在子文件夹中使用
  • @genesis:你能澄清一下你的意思吗?我发现这句话无法解析。
  • @genesis: 归根结底,除非你想建立一个递归搜索目录并返回文件路径的函数,否则你不能轻易地动态“找到”文件的位置。匹配的文件,或者如果您想逃到 shell 并进行查找。如果您正确构建此项目,您的文件结构不应更改。因此,只需使用建议的方法将服务器名称动态添加到 uri,以便它在域/主机之间工作
  • @George:看,你确实有开源软件,是自己编写的。用户可以将其添加到 /subdir/ 而不是 / - 对吗?现在,我有 seo 友好的网址。所以 url 看起来像 /subdir/any/url/ ,我需要从 /subdir/css/ 获取 css 文件 - 所以我需要检测 /subdir/ 作为应用程序路径。所以在 我可以使用 &lt;link href="&lt;?php APP_DIR; ?&gt;/css/some.css" .... /&gt;
  • $genesis:你正在寻找一条不必要的复杂路径。设置一个定义,或解析一个包含此路径的 .ini 文件,然后定义它,以便可以通过 setting.ini 文件轻松更改它。如果您真的想检测路径,我建议您转义到 shell,进行查找,然后让它返回路径。
【解决方案3】:
$url = "http" . ($_SERVER['HTTPS'] ? 's' : '') . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

【讨论】:

  • 我想从另一个页面调用该页面,例如 index.php。已编辑。但是谢谢:)
【解决方案4】:

此数据包含在 $_SERVER 超全局变量中

echo $_SERVER['REQUEST_URI']; // Output: /downloads/games/freegame_222/ajax.php

echo $_SERVER['SERVER_NAME']; // Output: mydomain.com

【讨论】:

  • 我想从另一个页面调用该页面,例如 index.php。但是非常感谢:)
  • @genesis:我的示例只是为了向您展示可用数据。你不需要回应它;您可以使用 header("Location:...") 重定向到另一个页面,或者以您想要的任何其他方式使用它。
  • George 我不是 PHP 新手,我知道这些超全局变量存在。但是我必须建立应用程序目录的绝对路径以供以后使用
  • @genesis:对那些给你免费建议的人大喊大叫是不接受免费建议的好方法。此外,如果您的问题不清楚,那么错误几乎不在于回答者。我希望这一切都适合你。
  • 对不起@George,昨天我编辑了我的问题,有人编辑了它并删除了我的编辑。请问你现在能读吗? "这些示例将在 url("ajax.php"); 函数被调用后返回"
【解决方案5】:

与问题无关,但值得一提的是,由于端口转发或反向代理,HTTP/HTTPS 可以省略。你可以这样做来克服这个问题:

function getBaseURL() {
    $isHttps = ((array_key_exists('HTTPS', $_SERVER) 
            && $_SERVER['HTTPS']) ||
        (array_key_exists('HTTP_X_FORWARDED_PROTO', $_SERVER) 
                && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    );
    return 'http' . ($isHttps ? 's' : '') .'://' . $_SERVER['SERVER_NAME'];
}

注意:这在使用 HTTPS 的 ELB 下部署的 Amazon EC2 上特别有用。

【讨论】:

    【解决方案6】:

    这里有一些不文明行为,阻止了@genesis 得到他需要的东西。

    因为我几乎“需要”同样的东西,所以这是我的(重新表述的)问题(以及可能的答案)。

    假设:应用程序几乎可以安装在任何地方,因为它会被某人从开源存储库下载。所以需要自动判断:

    1. 包含文件所需的安装目录的绝对路径(例如/var/www/myserver/mysubdir/);
    2. 同一个目录的绝对URL,例如,用于菜单导航和从应用程序中的任何位置调用 .php 文件(例如http://myserver.tld/mysubdir/
    3. 这些子目录可能存在未知的深度限制:例如,在主目录下,可能有/css/js,但也可能有/admin/plugins/js 之类的东西,但可能需要检索@987654326 @ 从顶级目录了解数据库连接字符串、全局应用程序参数等内容。
    4. 应用程序本身可能会单独使用几个级别;安装应用程序的用户也可能执行相同的操作(例如,/var/www/myserver 是虚拟主机指向的位置,但最终用户希望应用程序位于 /var/www/myserver/yes/I/really/want/it/this/deep 下,并希望应用程序在 @987654329 处功能齐全@

    我已经了解了 WordPress 是如何做到这一点的。基本上,WordPress 要求指向目录结构的 URL 由用户硬编码(其他应用程序不需要)。然后它使用

    提取目录路径(用于文件包含)

    if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');

    这看起来相当简洁,但实际上,问题在于如果您在目录层次结构中“很深”,则可能无法包含定义 ABSPATH 的文件。 WordPress 一直在做的是调用这两行代码并在确保获得有效的 ABSPATH 后包含所需的配置文件。

    但其他软件似乎组织得更好。它们会自动将 正确 URL 提取到网络服务器指向的目录;而且他们更神奇地能够找到所有包含文件的位置,无论它们位于子目录结构的多深。

    我能做的最好的就是模拟 WordPress:“强制”用户在配置文件中写入 URL,并且在所有级别和子级别上,几乎每个文件都使用

    if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');

    并尝试通过猜测来包含全局配置文件(例如,测试它是否在同一级别、上一级、上两级等等......)。

    这非常混乱,但似乎这就是一些黄金级应用程序(如 WordPress)正在做的事情。其他人似乎更有条理。他们是怎么做到的呢?我不知道。

    @genesis,这就是你的想法吗?

    【讨论】:

      【解决方案7】:

      以下函数可用于获取正确的绝对网址。

      function make_abs_url() {
          $path = $_SERVER['SERVER_NAME'] . '/' . $_SERVER['REQUEST_URI'];    
      
          $path_arr = explode("/", $path);
      
          $new_arr = array();
      
          for($i = 0; $i < count($path_arr); ++$i) {
      
              if(trim($path_arr[$i]) != "") {
      
                  $new_arr[] = $path_arr[$i];
      
              }
          }
      
          $element = array_pop ( $new_arr);
      
          $abs_path = implode("/", $new_arr);
      
          if(substr($abs_path, 0, 4) != "http") {
      
              $abs_path = "http://" . $abs_path;
          } 
      
          return $abs_path;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-10-18
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        相关资源
        最近更新 更多