如何生成脚本文件的绝对URL路径?

时间:2011-06-28 18:42:16

标签: php function absolute-path

这与this

几乎相同

我需要获取ABSOLUTE url到我的脚本。 例如,我有这个结构

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

我的应用程序root将在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

7 个答案:

答案 0 :(得分:7)

与George Cummins的答案类似,只需做类似的事情:

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

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

答案 1 :(得分:3)

$url = "http" . ($_SERVER['HTTPS'] ? 's' : '') . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

答案 2 :(得分:2)

此数据包含在$ _SERVER超全局

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

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

答案 3 :(得分:0)

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

以上示例将输出:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path

答案 4 :(得分:0)

与该问题无关,但值得一提的是,由于端口转发或反向代理,可以省略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特别有用。

答案 5 :(得分:0)

这里有一些不礼貌阻止@genesis获得他所需要的东西。

因为我几乎“需要”相同,这是我的(重新制定的)问题(以及一个潜在的答案)。

假设:应用程序几乎可以安装在任何地方,因为它将由某人从开源存储库下载。因此需要自动确定:

  1. 安装目录的绝对路径(例如/var/www/myserver/mysubdir/),包含文件;
  2. 绝对 URL 用于该目录,例如,用于菜单导航和从应用程序内的任何位置调用.php文件(例如http://myserver.tld/mysubdir/
  3. 这些子目录可能存在未知的深度限制:例如,在主目录下,可能有/css/js,但也有/admin/plugins/js之类的内容,但是,需要从顶级目录中检索config.php以了解数据库连接字符串,全局应用程序参数等内容。
  4. 应用程序本身可能会使用几个级别;安装应用程序的用户也可能也这样做(例如,/var/www/myserver是虚拟主机指向的位置,但最终用户希望应用程序位于/var/www/myserver/yes/I/really/want/it/this/deep之下并期望应用程序完全功能于http://myserver.tld/yes/I/really/want/it/this/deep
  5. 我已经看过WordPress如何做到这一点。基本上,WordPress 要求指向目录结构的URL是由用户进行硬编码(其他应用程序没有)。然后,它使用

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

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

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

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

    我能做的最好的事情是模仿WordPress:'强制'用户在配置文件中写入URL,并且在所有级别和子级别上,使用

    启动几乎所有文件

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

    并尝试通过guesswork包含全局配置文件(例如,测试它是否处于同一级别,一级上升,两级上升,等等......)。

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

    @genesis,这是你的想法吗?

答案 6 :(得分:0)

以下功能可用于获取正确的绝对网址。

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