简体   繁体   English

获取PHP网站的根URL

[英]Get root URL for a PHP website

I'm currently working on a PHP project and am looking for a way to get the URL for the root of the website; 我目前正在开发一个PHP项目,我正在寻找一种方法来获取网站根目录的URL; I have a configuration file at the root so I'm thinking as to using that to figure out the "base URL." 我在根目录下有一个配置文件,所以我正在考虑使用它来找出“基本URL”。 I'm looking for a way to do it dynamically so I can locate the URL of the root of the website, ie http://domain.com/my_app/ . 我正在寻找一种动态的方法,所以我可以找到网站根目录的URL,即http://domain.com/my_app/ I am doing my best to avoid using relative paths and am using PHP to generate the URLs for whatever I am using. 我正在尽力避免使用相对路径,并使用PHP生成我正在使用的任何URL。 For example, I am using PHP to generate CSS code and the CSS code link to images so I would like to get an absolute URL in here instead of a relative path. 例如,我使用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

In my resources/css/css.php file, I am looking at getting the "base URL" so I can generate an absolute URL to the imgs folder like http://domain.com/resources/imgs/my-image.png but currently I am getting http://domain.com/resources/css/imgs/my-image.png since the defines below look at getting the directory of the loaded PHP file, not the included one. 在我的resources/css/css.php文件中,我正在寻找“基本URL”,因此我可以生成imgs文件夹的绝对URL,如http://domain.com/resources/imgs/my-image.png但目前我正在http://domain.com/resources/css/imgs/my-image.png因为下面的定义看到了获取加载的PHP文件的目录,而不是包含的文件。 I would also like to share images between the folders (ie access the shared-image.png file from the admin folder) so getting the base URL would be ideal in generating links. 我还想在文件夹之间共享图像(即从admin文件夹访问shared-image.png文件),因此获取基本URL将是生成链接的理想选择。 The reason I an avoiding relative paths is because I have a function that creates a URL, createURL() , so I can get all the URLs working without having to hard code anything. 我避免相对路径的原因是因为我有一个创建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;
}

All of these defines are located in my configuration file, so I am thinking that the best way to do this is to get the URL for the config file ( http://domain.com/my_app/config.php ) and just strip the "config.php." 所有这些定义都位于我的配置文件中,所以我认为最好的方法是获取配置文件的URL( http://domain.com/my_app/config.php )并剥离“config.php文件。” Keep in mind, the website could be hosted deeper in a folder structure http://domain.com/my_app/another/folder/config.php or no sub folders http://domain.com/config.php . 请记住,网站可以更深入地托管在文件夹结构http://domain.com/my_app/another/folder/config.php或没有子文件夹http://domain.com/config.php

Is this possible, if so how can it be done? 这是可能的,如果可以的话怎么办呢? Or is there another approach I should follow? 或者我应该遵循另一种方法吗?

After doing a var_dump of $_SERVER and messing around I found that I could generate the base URL with this solution, in case anyone stumbles upon this question. 在执行$_SERVERvar_dump并乱搞后,我发现我可以使用此解决方案生成基本URL,以防任何人偶然发现此问题。 I'm sure there are other ways but this is what worked for me. 我确信还有其他方法,但这对我有用。

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

I just needed the same thing I combined the answers from here and here to create this solution which can be easily converted to multiple constants and/or a function. 我只需要将这里这里的答案结合起来创建这个解决方案,可以很容易地转换为多个常量和/或函数。 I use a single entry point for my web application (index.php) and have my config in a sub-folder. 我为我的Web应用程序使用单个入口点(index.php)并将我的配置放在子文件夹中。 You can either strip the known folder as shown in the commented line of code or run this from the main folder. 您可以删除已注释的代码行中显示的已知文件夹,也可以从主文件夹中运行它。 As example your structure could be either/or of: 例如,您的结构可以是/或:

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

or 要么

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

Entire Code: 整个代码:

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

Based server configurations: The output may not contain a trailing slash / if wanted then use either of: 基于服务器配置:输出可能不包含尾部斜杠/如果需要,则使用以下任一项:

  • $urlDir = str_replace('/include', '/',str_replace($docRoot, '/', $dirRoot));
  • $urlDir = str_replace($docRoot, '/', $dirRoot);

BTW, the function seems unnecessary as example: 顺便说一句,这个函数似乎没必要作为例子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM