【问题标题】:PHP - make paths relative when including filePHP - 包含文件时使路径相对
【发布时间】:2013-04-09 23:13:53
【问题描述】:

在站点根目录中,我有以下文件夹和文件:

文件包含/scripts.php 包含指向其余页面运行所需的所有 css/js 文件的链接。从站点根目录中的任何文件(例如 cart.php)中包含 scripts.php 时,所有路径都可以正常工作。但是当从文件夹中包含时(例如 /admin),路径不正确,显然是因为 /admin 中没有 /js 或 /css 目录。

我尝试了几件事,例如将 scripts.php 中的路径从 '../css/styles.css' 更改为 ./css/styles.css 或只是 /css/styles.css,但没有奏效。也试过include($_SERVER["DOCUMENT_ROOT"] . "includes/scripts.php");,但也没有成功。

如何在 scripts.php 中设置相对路径,以便无论从何处包含它,所有 css/js 路径都是正确的并且与站点根目录相关?

这是scripts.php中一些链接文件的示例:

<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.9.2.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.alerts.js"></script> 
<script type="text/javascript" src="js/cookie.js"></script> 
<link rel="stylesheet" type="text/css" href="css/styles.css">
<link rel="stylesheet" type="text/css" href="css/layout.css">

等等……

编辑:我看到大多数答案都理所当然地认为文件托管在 UNIX 环境中,这是不正确的,它是在 Windows/Apache 设置上开发的,并将被托管完成后在 UNIX 服务器上。所以我需要一个适用于两个系统的解决方案,这样我在编辑/上传文件到实时服务器时都不需要更改代码。

【问题讨论】:

    标签: php include relative-path


    【解决方案1】:

    包含在 PHP 中

    方法 1 - 使用常量

    在包含任何其他文件之前,在您的一个根文件(例如 index.php,或创建一个您始终在任何其他包含之前相对包含的文件)中创建一个常量(例如 ROOTDIR):

    //Place this in a file you always include relatively
    define("ROOTDIR", dirname(__FILE__) . "/");
    

    无论您在哪里添加内容:

    //Place this in whatever file
    require_once(ROOTDIR . "admin/panels/users.php");
    

    方法 2 - 使用 set_include_path

    或者,在同一个文件中,您可以使用 set_include_path 来代替常量:

    //Place this in a file you always include relatively
    set_include_path(dirname(__FILE__) . "/");
    

    当你包含东西时:

    //Place this in whatever file
    require_once("admin/panels/users.php");
    

    方法 3 - 通过 PHP 配置

    如果您不想使用常量和set_include_path 并且可以访问PHP 配置文件,您也可以将配置中的include_path 更改为例如。 /var/www/,然后在包含文件时简单地使用上面的require_onceMore info about that here.


    但是包含脚本和样式表怎么样,h2ooooooo?

    嗯,我知道你会参与其中。我通常倾向于做的是通过以/ 开头来创建相对于 root 的路径:

    <script type="text/javascript" src="/js/jquery-1.8.0.min.js"></script>
    <!--                                ^                     -->
    

    或者您也可以在 HTML 中设置 &lt;base&gt; 路径:

    <head>
        <base href="http://www.mydomain.com/" />
        <script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
    </head>
    

    注意:在设置&lt;base&gt; 路径时,它还指定所有链接也将相对于基本路径,因此如果您在管理文件夹中有指向的链接subdir/ 它将链接到 http://www.mydomain.com/subdir/not http://www.mydomain.com/admin/subdir/

    【讨论】:

    • 我认为这里的问题是 html 文件中的 CSS/JS 链接没有正确链接,而不是包含 PHP 文件
    • @DamienLegros 这可能是 - 我也添加了一个解释。
    • 不错的概述。请注意,您需要在方法 1 中使用前导 /,例如:define("ROOTDIR", dirname(__FILE__) . "/");require_once(ROOTDIR . "/admin/panels/users.php");
    • @TaZ 你是完全正确的——我一定急需更多的咖啡。谢谢!
    • 感谢您的解决方案,但我认为它们仅适用于 linux/unix 服务器,不适用于 windows/apache 配置。使用解决方案 1 和 2,我收到以下警告:include(C:\inetpub\wwwroot\XXXXX\includes/includes/scripts.php) [function.include]: failed to open stream: No such file or directory in C:\inetpub\wwwroot\XXXXX\index.php on line 26 和解决方案 3 和 4 我必须更改太多文件,并且在从测试(本地主机)上传到实时(网络服务器)时更改基础。
    【解决方案2】:

    请进行以下更改,而不是 include($_SERVER["DOCUMENT_ROOT"] . "includes/scripts.php");

    <script type="text/javascript" src="<?php echo $_SERVER["DOCUMENT_ROOT"];?><js/jquery-1.8.0.min.js"></script>
    <script type="text/javascript" src="<?php echo $_SERVER["DOCUMENT_ROOT"];?>js/jquery-ui-1.9.2.custom.min.js"></script>
    <script type="text/javascript" src="<?php echo $_SERVER["DOCUMENT_ROOT"];?>js/jquery.alerts.js"></script> 
    <script type="text/javascript" src="<?php echo $_SERVER["DOCUMENT_ROOT"];?>js/cookie.js"></script> 
    <link rel="stylesheet" type="text/css" href="<?php echo $_SERVER["DOCUMENT_ROOT"];?>css/styles.css">
    <link rel="stylesheet" type="text/css" href="<?php echo $_SERVER["DOCUMENT_ROOT"];?>css/layout.css">
    

    【讨论】:

    • 谢谢,但您的解决方案使链接看起来像:C:/inetpub/wwwroot/js/backgroundScale.js 缺少站点根目录并使其无法访问。
    • 在本地它会显示驱动文件夹,但在服务器它类似于这个路径 $_SERVER["DOCUMENT_ROOT"] => /var/services/web/mysite
    • 我也需要本地机器的解决方案,而不仅仅是服务器。
    【解决方案3】:

    解决方案 1: 在你的 html &lt;head&gt; 中使用 base 标签,注意:这会影响所有的相关链接

    <base href="http://yoursite.com/" />
    

    解决方案 2: 在你的 htaccess 文件中定义一个环境变量

    SetEnv MYSITE_URL http://yoursite.com/
    

    然后在您的 html 中回显该环境变量

    <script type="text/javascript" src="<?php echo getenv('MYSITE_URL'); ?>js/jquery-1.8.0.min.js"></script>
    <script type="text/javascript" src="<?php echo getenv('MYSITE_URL'); ?>js/jquery-ui-1.9.2.custom.min.js"></script>
    ...
    

    解决方案 3: 与解决方案 2 类似,但使用您的网站 url 创建一个 php 常量并将其回显到您的 html 中

    解决方案 4:/ 开始您的资产路径

    【讨论】:

    • 我已经尝试过解决方案 4,但如果我包含不在根目录中的文件,则指向资产的链接不正确。解决方案 1 和 2 在 Windows 机器上不起作用。我会尝试解决方案 3,然后告诉你。
    • @bikey77 解决方案 2 只要你使用 apache 就可以工作(win 或 linux 没关系)
    【解决方案4】:

    尝试使用这些功能,但如果需要,您需要将其放在根文件夹中

    function($_file){
    php_uname();
    $server_info = PHP_OS; // get host os info
    $os = strtoupper(substr(PHP_OS, 0, 3));
    if($os === 'WIN'){
        $path = dirname( $file );
        $p = explode(':',$path);
        return str_replace(array('\\','\\'), array('/','/'), $p[1]); //return the absolute path
    }else{
        return dirname( $file );
    }
    }
    

    示例:

    include get_path(__DIR__).path/to/asset/file.js
    

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 2019-04-21
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多