获取 PHP 网站的根 URL


Get root URL for a PHP website

我目前正在做一个PHP项目,正在寻找一种方法来获取网站根目录的URL;我在根目录有一个配置文件,所以我正在考虑使用它来找出"基本 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文件中,我正在考虑获取"基本 URL",以便我可以像http://domain.com/resources/imgs/my-image.png一样生成指向 imgs 文件夹的绝对 URL,但目前我正在http://domain.com/resources/css/imgs/my-image.png,因为下面的定义着眼于获取加载的 PHP 文件的目录,而不是包含的目录。我还想在文件夹之间共享图像(即从admin文件夹中访问shared-image.png文件),因此获取基本 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

这是否可能,如果可能,如何做到这一点?还是我应该遵循另一种方法?

在做了一var_dump $_SERVER并弄乱之后,我发现我可以使用此解决方案生成基本 URL,以防有人偶然发现这个问题。我相信还有其他方法,但这就是对我有用的方法。

<?php
DEFINE('BASE_URL', HTTP_TYPE . "://" . HTTP_ROOT . substr(__DIR__, strlen($_SERVER[ 'DOCUMENT_ROOT' ])) . '/');

我只需要同样的东西,我结合了这里和这里的答案来创建这个解决方案,它可以很容易地转换为多个常量和/或函数。我为我的 Web 应用程序(索引.php)使用单个入口点,并将我的配置放在一个子文件夹中。您可以按照注释代码行中所示去除已知文件夹,也可以从主文件夹运行此文件夹。例如,您的结构可以是以下之一/或:

    /
  • public/html/some/random/folder/THEAPP/config.php
    • $urlDir = str_replace($docRoot, '', $dirRoot);

    /
  • public/html/some/random/folder/THEAPP/include/config.php
    • $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';
    };