0

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

在此处输入图像描述

文件包含/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">

ETC...

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

4

4 回答 4

6

包含在 PHP 中

方法 1 - 使用常量

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

//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_once在包含文件时简单地使用上面。更多关于这里的信息。


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

好吧,我知道你会参与其中。我通常倾向于做的是通过以以下方式启动相对于 root 的路径/

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

或者您也可以<base>在 HTML 中设置路径:

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

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

于 2013-04-17T09:03:55.437 回答
1

请进行以下更改,而不是 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">
于 2013-04-17T09:07:20.443 回答
0

解决方案 1:base在您的 html 中 使用标签<head>,注意:这将影响所有相关链接

<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: 从您的资产路径开始/

于 2013-04-17T09:27:43.400 回答
0

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

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
于 2017-07-19T16:00:49.073 回答