Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在不同的目录深度从不同的页面动态添加相同的CSS文件_Php_Html_Web_Relative Path_Directory - Fatal编程技术网

Php 在不同的目录深度从不同的页面动态添加相同的CSS文件

Php 在不同的目录深度从不同的页面动态添加相同的CSS文件,php,html,web,relative-path,directory,Php,Html,Web,Relative Path,Directory,好吧,我已经想了一段时间了。 我有一个正在开发的网站,这里是我的基本结构: index.php page-x/ index.php page-x-y/ index.php include/ functions.php css/ main.css 除了添加更多子文件夹和索引页。 基本上是三个不同级别的页面 它们都需要css/main.css,但是任何一个索引页的路径都会不同 现在我使用functions.php添加CSS,并且已经必须手动输入从索引

好吧,我已经想了一段时间了。 我有一个正在开发的网站,这里是我的基本结构:

index.php
page-x/
    index.php
    page-x-y/
        index.php
include/
    functions.php
css/
    main.css
除了添加更多子文件夹和索引页。 基本上是三个不同级别的页面

它们都需要css/main.css,但是任何一个索引页的路径都会不同

现在我使用functions.php添加CSS,并且已经必须手动输入从索引页到functions.php的相对路径(即
require\u once(“../include/functions.php”);
。/../include

如何使functions.php能够计算出从包含它的任何索引页到css/main.css的相对路径

即,如何在functions.php中为以下代码定义
$relDir

echo '<link rel="stylesheet" type="text/css" href="' . $relDir . 'css/main.css" />';
(注意:我在EasyHP上使用的是别名,因此我可以从
http://127.0.0.1:8888/site/
但是
\uuuuu DIR\uuuu
查找文件的实际目录

在我测试的(我的大学)服务器上

"/Volumes/Web/Students/MYNAME/Sites/MYSITE/css/main.css"
网站的实际URL如下所示:

http://www.SCHOOL.com/MYNAME/MYSITE/
CSS在这两种情况下都不会链接


编辑2我可以将
$relDir
定义为:

 str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');
根据索引的深度返回以下内容之一:

""
"../"
"../../"
这显然需要大量的处理。听起来最好的办法是研究合适的测试环境,并使用绝对路径。我会研究一下。我对这些东西还是有点生疏


编辑1:好的,大多数人建议我坚持手动操作,最初有一个类似这样的函数调用:

<?php require_once("../include/functions.php");
buildHead("Music", "../"); //($title, $relDir) ?>


我只需要在每页的两个位置将
。/
更改为任何内容。

你为什么还要尝试使用相对路径?你不能将其链接为
/css/main.css
?那么它将始终相对于你站点的根目录,而不是当前目录。

最简单的方法?使用绝对路径。如果你的网站保持在一个固定路径上很容易。如果你想让自己自由地更改网站的结构,请添加一个配置参数——例如,在每个PHP文件的顶部包含一个配置文件,并在其中定义一个$BASE参数,该参数保存应用程序库的绝对路径,然后执行以下操作:

echo '<link rel="stylesheet" type="text/css" href="'.$BASE.'/css/main.css" />'

否则,如果它位于目录中,您只需向上移动,但这在您部署时是已知的,并且不依赖于请求。

hm

否则你可以

echo str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');

您必须使用
$\u服务器['DOCUMENT\u ROOT']
获取站点基本目录。然后将此值放入会话中。然后您可以使用 在base index.php中

$dir = $_SERVER['DOCUMENT_ROOT'];
$include = $dir. "/includes/functions.php";
$_SESSION['include_dir'] = $include;
您可以使用的其他文件

reqire($_SESSION['include_dir']);

这可能会在最终的站点上起作用,但出于本地测试目的,以及我所在的服务器,站点根目录不在.com+1之后,这就是为什么在开发和生产环境中使用相同的根目录总是一个好主意。@user730492为什么不使用virtualhosts和伪本地子域?比如“website1.local”->将其添加到主机文件,并使其指向127.0.0.1(或开发服务器的IP)然后在本地http服务器中配置vhost。事实上,您甚至可以使用真实的域并使整个子域指向127.0.0.1,如local.yourdomain.com.Thank Capsule。现在我正在使用EasyHP,我有一个别名,可以从()连接,我不确定你还说了些什么,但我会努力研究一下。@capsule是的,我不确定如何做到这一切,如果你知道有什么资源可以帮助我,那就太棒了。这不是个坏主意,尽管我不喜欢每次我想做本地测试时都要更改$BASE的想法。因为你没有一个合适的测试环境;-)请参阅我对@Mark答案的评论。您可以使用配置文件中的___;构造自动定义基:)How(更具体地说)我会这样做吗?就像在php安装配置文件中一样?@Capsule:我使用类似的模式,尽管我有适当的测试和生产环境。但是,我没有登台环境,我需要求助于共享托管,所以我将网站放在一个目录中…然后我需要这个机制。如果我能够使用子域,绝对琵琶路径将是完美的。哦,哇,这真的很有效!我必须让它
str_重复('../',substr_计数($_SERVER['REQUEST_URI'],'/')-2)
虽然如此,只是因为我目前不在URL的根目录上。但是,谢谢你!回答了这个问题,但这样做有点浪费。@Palantir下面的答案更有意义,而且是一种更常见的模式。@LucasUP刚刚阅读了它。最好的方法是使用Palantir的方法。我也有同样的问题。我的本地开发人员对于我所处理的所有项目,服务器只有一台主机,根据我所处理的客户机,我有不同的暂存服务器,然后每个项目通常有一个域。当前路径的常量可以用于各种事情,包括您的问题,这是@Flask提供的“一次使用”解决方案的优势。这一个是A b它在我上面,但我想我理解要点。实际上还没有做任何会话的东西。如果你可以得到你的基本路径和你的网站路径不会改变,那么你可以在你的配置文件中定义为静态变量,然后使用它。
$dir = $_SERVER['DOCUMENT_ROOT'];
$include = $dir. "/includes/functions.php";
$_SESSION['include_dir'] = $include;
reqire($_SESSION['include_dir']);