这与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
答案 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获得他所需要的东西。
因为我几乎“需要”相同,这是我的(重新制定的)问题(以及一个潜在的答案)。
假设:应用程序几乎可以安装在任何地方,因为它将由某人从开源存储库下载。因此需要自动确定:
/var/www/myserver/mysubdir/
),包含文件; http://myserver.tld/mysubdir/
)/css
,/js
,但也有/admin/plugins/js
之类的内容,但是,需要从顶级目录中检索config.php
以了解数据库连接字符串,全局应用程序参数等内容。/var/www/myserver
是虚拟主机指向的位置,但最终用户希望应用程序位于/var/www/myserver/yes/I/really/want/it/this/deep
之下并期望应用程序完全功能于http://myserver.tld/yes/I/really/want/it/this/deep
我已经看过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;
}