【问题标题】:Get root URL for a PHP website获取 PHP 网站的根 URL
【发布时间】:2013-11-01 05:07:13
【问题描述】:

我目前正在开发一个 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”,因此我可以生成指向 imgs 文件夹的绝对 URL,例如 http://domain.com/resources/imgs/my-image.png,但目前我正在获取 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 的更深处托管。

这可能吗,如果可以,怎么做?还是我应该遵循另一种方法?

【问题讨论】:

  • 是客户端的URL,还是服务端的路径? (另请注意,HTTP_X_FORWARDED_PROTO 仅在客户端发送 X-Forwarded-Proto 标头时才设置,但并非总是如此。)
  • 不清楚,您在resources/css 中并希望获得my_app/ 或者您在我的应用程序中,包括resources/css 中的一个文件并获得这个?
  • 你不能只解析你想要的URL部分吗?您使用当前的 BASE_URL 并在错误的地方进行拆分?
  • @zneak 客户端 URL @lampwins 我在resources/css 目录中,想获得my_app/,我已经编辑了我的问题。 @MichaelVilleneuve 问题是我不一定知道哪一部分会出错,我不想硬编码任何东西
  • @allejo 你不知道什么不好,但你知道什么是好的吗?如果是这样,我得到了你的答案

标签: php


【解决方案1】:

在做了var_dump$_SERVER 并搞砸之后,我发现我可以用这个解决方案生成基本 URL,以防有人偶然发现这个问题。我敢肯定还有其他方法,但这对我有用。

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

【讨论】:

    【解决方案2】:

    我只需要将herehere 的答案组合在一起的相同内容来创建可以轻松转换为多个常量和/或函数的解决方案。 我为我的 Web 应用程序 (index.php) 使用一个入口点,并将我的配置放在一个子文件夹中。 您可以像注释的代码行中所示剥离已知文件夹,也可以从主文件夹运行它。例如,您的结构可以是/或:

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

    • /public/html/some/random/folders/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';
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多