我目前正在开发一个PHP项目,我正在寻找一种方法来获取网站根目录的URL;我在根目录下有一个配置文件,所以我正在考虑使用它来找出“基本URL”。我正在寻找一种动态的方法,以便找到网站根目录的网址,即http://domain.com/my_app/
。我正在尽力避免使用相对路径,并使用PHP生成我正在使用的任何URL。例如,我使用PHP生成CSS代码和CSS代码链接到图像,所以我想在这里获得绝对URL而不是相对路径。
my_app/
admin/
resources/
css/
admin-css.php
imgs/
login.png
resources/
css/
css.php
imgs/
my-image.png
shared-image.png
config.php
在我的resources/css/css.php
文件中,我正在查看“基本网址”,因此我可以生成imgs
文件夹的绝对网址,例如http://domain.com/resources/imgs/my-image.png
,但目前我正在http://domain.com/resources/css/imgs/my-image.png
1}}因为下面的定义看到获取加载的PHP文件的目录,而不是包含的文件。我还想在文件夹之间共享图像(即从shared-image.png
文件夹访问admin
文件),因此获取基本URL将是生成链接的理想选择。我避免相对路径的原因是因为我有一个创建URL的函数createURL()
,所以我可以使所有的URL工作而无需硬编码。
<?php
DEFINE('HTTP_TYPE', $_SERVER['HTTP_X_FORWARDED_PROTO']);
DEFINE('HTTP_ROOT', $_SERVER['HTTP_HOST']);
DEFINE('HTTP_FOLDER', dirname($_SERVER['PHP_SELF']) . '/');
DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . HTTP_FOLDER);
function createURL($pathFromRoot)
{
return BASE_URL . $pathFromRoot;
}
所有这些定义都位于我的配置文件中,因此我认为最好的方法是获取配置文件的URL(http://domain.com/my_app/config.php
)并删除“config.php”。 “请注意,网站可以更深入地托管在文件夹结构中http://domain.com/my_app/another/folder/config.php
或没有子文件夹http://domain.com/config.php
。
这是可能的,如果可以的话怎么办?或者我应该遵循另一种方法吗?
答案 0 :(得分:6)
在var_dump
$_SERVER
之后,我发现我可以使用此解决方案生成基本URL,以防万一有人偶然发现这个问题。我确信还有其他方法,但这对我有用。
<?php
DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . substr(__DIR__, strlen($_SERVER[ 'DOCUMENT_ROOT' ])) . '/');
答案 1 :(得分:2)
我只需要将here和here的答案结合起来创建这个可以轻松转换为多个常量和/或函数的解决方案。 我为我的Web应用程序使用单个入口点(index.php)并将我的配置放在子文件夹中。 您可以删除已注释的代码行中显示的已知文件夹,也可以从主文件夹中运行它。例如,您的结构可以是/或:
$urlDir = str_replace($docRoot, '', $dirRoot);
或
$urlDir = str_replace('/include', '/',str_replace($docRoot, '', $dirRoot));
整个代码:
$domain = $_SERVER['HTTP_HOST'];
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$dirRoot = dirname(__FILE__);
$protocol = isset($_SERVER["HTTPS"]) ? 'https://' : 'http://';
//$urlDir = str_replace('/include', '/',str_replace($docRoot, '', $dirRoot));
$urlDir = str_replace($docRoot, '', $dirRoot);
$site_path = $protocol.$domain.$urlDir;
define ('BASE_URL', $site_path);
基于服务器配置:输出可能不包含尾部斜杠/如果需要,则使用以下任一项:
$urlDir = str_replace('/include', '/',str_replace($docRoot, '/', $dirRoot));
$urlDir = str_replace($docRoot, '/', $dirRoot);
function createURL($pathFromRoot)
{
return BASE_URL . $pathFromRoot;
}
//Anywhere you can call `createURL($value)` makes the following true
$isTrue = createURL('/static/js/my.js') === BASE_URL.'/static/js/my.js';
$someNeededURL = '/static/whatever/is/converted/';
$alsoTrue = createURL($someNeededURL) === BASE_URL.$someNeededURL;
//and just for fun
if ($isTrue.$alsoTrue === 11){
echo 'Not eleven';
} else {
echo $isTrue.$alsoTrue.'!==11';
};