【问题标题】:Absolute Relative path issues in referencing web assets - need help - php related引用网络资产中的绝对相对路径问题 - 需要帮助 - php相关
【发布时间】:2010-12-04 13:01:28
【问题描述】:

大家好,我现在有点麻烦。首先,我用 PHP 构建了一个带有管理面板的简单 CMS,目录结构如下:

root/
    ->admin/
    ->images/

它工作得很好,但是客户要求发生了变化,他们希望不必将管理文件夹作为根目录中的文件夹访问,而是作为 Web 子域访问。所以 www.site.com/admin 变成了 admin.site.com

然而,这已经把我所做的所有引用都搞砸了,几乎毁掉了所有的引用。就像我在 CMS 上上传图像一样 - 但是现在在 ../images 上上传不起作用,因为它现在在子域下,而且我在尝试从那里相对引用图像时都搞砸了。几周以来,我一直试图破解我的配置文件,但无法解决这个问题 :( - 请帮助 - 在前端,该网站还可以。但我的管理部分都搞砸了 :(

我正在使用 PHP 和 MySQL。

【问题讨论】:

    标签: php mysql directory


    【解决方案1】:

    听起来您已经了解了相对路径的毒性。

    可能的快速修复:如果您将/symlink/alias admin.domain.com/images 指向前端站点上的同一个图像文件夹会发生什么?我认为额外的“../”es基本上会被忽略。

    更永久地,一般来说,不要使用相对路径。它们只会给你带来痛苦。几个策略:

    1) 为图像、css 等定义一些指向正确位置的常量:

    define('IMG_DIR','/images');
    define('CSS_DIR','/images');
    // ... some time later
    echo '<img src="' . IMG_DIR . '/myimage.jpg'"/>';
    

    2) 更好:只需保持一个常量,告诉您应用程序的位置。

    define('APP_ROOT','/myapp'); //could be chanted to just '/' if it doesn't live in some folder on the server
    // ... later that day ...
    echo '<img src=\"' . APP_ROOT . '/images/myimage.jpg"/>';
    // ... or maybe you need to link to a logout script?
    echo '<a href="'. APP_ROOT . '/auth/logout.php">Log Out</a>';
    

    假设您的应用程序可能需要从根 ("/") 或服务器上的某个目录等运行,这一点很重要。

    对于您可能纯粹在服务器端执行的任何文件系统操作也是如此。使用绝对文件系统路径。如果你的主应用程序有一个像“config/config.php”这样的脚本,你可以把它贴在顶部:

    define('APP_FS_ROOT',realpath(dirname(__FILE__) . '/..'));
    

    【讨论】:

    • 我听到你响亮而清晰的声音 - realpath dirname 函数正是我快速修复所需要的:D - 你们非常感谢所有的帮助:D
    • +1 因为如果我在回答之前看到它,我会投票赞成你的答案。
    【解决方案2】:

    假设前端和管理员都在同一个文件系统上,您将需要对管理员中的所有内容使用绝对路径。在管理员的配置中创建一个映射到前端物理上传/图像文件夹的定义。例如,从字体端您可以使用相对路径 ./upload 访问上传文件夹,但从 admin.example.com 站点您将需要使用绝对路径 /user/example.com/upload。

    fontend 的配置看起来像(www.site.com/config.php):

    define("UPLOAD_FOLDER", "./uploads");
    define("WEB_UPLOAD_FOLDER", "/uploads");
    

    管理员的配置看起来像(admin.site.com/config.php):

    define("UPLOAD_FOLDER", "/user/site.com/upload");
    define("WEB_UPLOAD_FOLDER", "http://www.site.com/uploads");
    

    然后前端和管理员都会引用物理文件夹:

    $filename = UPLOAD_FOLDER . "/myupload.mp3";
    

    要创建上传的超链接,您可以使用:

    <a href="<?php echo WEB_UPLOAD_FOLDER . "/myupload.mp3" ?>">My Upload</a>
    

    【讨论】:

    • +1 可能是解决 OP 问题的更好方法,即使我们说的是同样的事情。 (而且因为我们蒂姆需要团结在一起:-))
    【解决方案3】:

    另一种可能的解决方案是在 apache 中为您移动的目录定义一个目录别名。

    假设您的子域根是 /子域/图像

    <VirtualHost>
    ...
    Alias /images "/subdomains/images"
    ...
    </VirtualHost>
    

    www.yourDomain.com/images 和 images.yourDomain.com 都会加载相同的文件。

    或者,如果您使用 linux,则符号链接可以完成同样的事情。

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 2018-03-26
      • 2013-08-06
      • 2012-12-03
      • 2012-04-21
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多