【问题标题】:PHP Template include() causing directory errorsPHP 模板 include() 导致目录错误
【发布时间】:2011-12-01 11:56:20
【问题描述】:

我在使用 php include()require() 函数时遇到了这个问题。我会在这里尽可能地解释它,但如果它没有意义,请告诉我。我正在构建一个主题系统,其中主要的index.phpinclude ('themes/main/header.php'),但链接样式表和图像时出现错误。这是我的目录的设置方式。

  • htdocs
    • index.php
    • 主题
      • 主要
        • header.php
        • footer.php
        • 图片
        • CSS
        • js

这是我的 header.php(条纹)的内容:

<html>
    <head>
        <link rel="stylesheet" href="css/layout.css" type="text/css" media="screen" />
    </head>
<body>
<div class="header">
<img src="images/logo.png" />
</div>

当我加载主 index.php 时,无法找到样式表和图像。我知道这是因为头文件被带入了 index.php 文件,但有没有办法解决这个问题?非常感谢。

【问题讨论】:

    标签: php html css include image


    【解决方案1】:

    PHP 的包含(在 PHP 中)位于服务器端,但 HTML 文件中的引用是客户端的,因此它们引用其感知的文件 (index.php)。只需调整文件中的路径以适应即可。

    【讨论】:

      【解决方案2】:

      最简单的解决方案是在模板文件中添加一个“template_path”变量并将该变量传递给模板解析器:

      <html>
          <head>
              <link rel="stylesheet" href="{TEMPLATE_PATH}css/layout.css" type="text/css" media="screen" />
          </head>
      <body>
      <div class="header">
      <img src="{TEMPLATE_PATH}images/logo.png" />
      </div>
      

      【讨论】:

      • 好的。如何定义 {TEMPLATE_PATH}
      • 我假设您使用某种模板引擎。所以 {TEMPLATE_PATH} 是模板引擎变量,在初始化模板引擎时,您会传递一些变量,例如 $templatePath = '/themes/main/'; 然后模板引擎替换引擎变量,例如:$search = array("{TEMPLATE_PATH}"); $replace = array($templatePath); $newphrase = str_replace($search, $replace, $template); 这只是一个原则,而不是确切的实现。
      【解决方案3】:

      我,就我自己而言,使用这样的东西:

      define(SITE_ROOT, '/'); //client side root of website
      define(SITE_PATH, '/var/www/mywebsite/htdocs/'); //serverside root of website 
      
      function url($relative, $startingFrom = false, $echo = true) {
          $r = '';
          if($startingFrom === false) {
              $r = SITE_ROOT . $relative;
          } else {
              $forward = str_replace('\\', '/', $startingFrom);
              $path = substr($forward, 0, strrpos($forward, '/'));
              $r = SITE_ROOT . substr($path, strlen(SITE_PATH)) . '/' . $relative;
          }
          if($echo) {
              echo $r;
          } else {
              return $r;
          }
      }
      

      简而言之,这将为您构建一个“站点绝对”路径,这样您还可以更改“主题”的名称,而无需更改其中包含的所有绝对引用。

      这样,在header.php你可以写:

      <link rel="stylesheet" href="<?php url('css/layout.css', __FILE__);?>" type="text/css" media="screen" />
      

      该函数有几个可选属性,它们应该是不言自明的。

      【讨论】:

        【解决方案4】:

        在php中包含文件不会切断浏览器的路径,在html中应该是

        <link rel="stylesheet" href="/themes/main/css/layout.css" type="text/css" media="screen" />
        

        【讨论】:

        • 好的。我一直在寻找类似 wordpress 系统的东西。你知道它是怎么工作的吗?
        • 我不确定这是如何在 wordpress 中完成的,但您可以创建读取 css 文件并返回带有修改的标题的内容的 php 文件。该文件可以位于名称 css.php 下的主文件夹中,它将从主题中读取并返回 css 文件。
        【解决方案5】:

        我在重读您的问题后进行了编辑 - 将您的路径更改为:

        href="/themes/main/css/layout.css" 
        src="/themes/main/images/logo.png" 
        

        这应该可以解决它,但您应该考虑使用“http”绝对路径作为最佳实践。希望对你有帮助。

        【讨论】:

        • 使用“http”绝对路径是最糟糕的做法。为什么你认为它会有所帮助?
        • 哇,你先夸我,然后你反手我;不知道这里发生了什么。根据我的经验,缓存更频繁地发生在完整的“http”路径中,尤其是代理,此外,我通常喜欢将我的样式保留在您查看源代码的页面上。
        • 它与代理无关。只是因为浏览器的地址栏旁边没有URL之类的东西。 HTTP请求只包含路径,没有http,也没有域名。因此,通过代理对两种情况都进行相同的请求。
        【解决方案6】:

        您需要将您的文件名引用到index.php。解决此问题的另一种方法是在包含完整网站 URL 的配置文件(或类似这样的小项目中,仅在 index.php 中)中声明一些变量:

        $site = http://www.example.com/

        然后将其用于您的所有 css、链接、脚本等引用。这样,它将是一条绝对路径。然后您可以执行以下操作:

        &lt;img src="&lt;?= $site ?&gt;images/logo.png" /&gt;

        如果我没记错的话,我认为使用绝对路径更适合 SEO(搜索引擎优化)。

        【讨论】:

          【解决方案7】:

          通常有两种选择:

          • 首先,使用绝对 URL(即包含 http://.../css/layout.css 的完整 URL 或仅来自根目录的路径,例如 /themes/main/css/layout.css
          • 其次,从包含其他文件的“主”文件构建相对路径。在这种情况下,就是/themes/main/css/layout.css

          【讨论】:

          • 你的意图是好的,但措辞与他们不同
          • 呃什么?使用绝对路径是最好的方法。他们将工作形式任何文件/包括一个人的愿望。这怎么不符合主题发布者想知道的?
          • 绝对路径 - 是的,不是您的示例中的完整网址。使用完整的 http url 寻址您自己的网站是没有意义的。绝对路径就足够了。从任何文件创建的相对路径都不是一个选项。始终使用来自站点根目录的绝对路径。
          • 嗯好的。 domain.com 可以省略是有道理的(即没有它会更简洁),但是还有其他不包括域名的原因吗?
          • @WillemMulder:可移植性。例如,使用相同的代码进行开发、测试和生产。
          猜你喜欢
          • 2020-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 2023-03-11
          • 2016-11-12
          • 1970-01-01
          相关资源
          最近更新 更多