【问题标题】:Relative file paths for links within a PHP includePHP 中链接的相对文件路径包括
【发布时间】:2017-06-27 19:29:21
【问题描述】:

我有一个 header.php 文件,我将其用作我网站每个页面的包含。其中包含网站的导航链接。

注意:我不想使用绝对文件路径,因为我不知道要上传网站的服务器的文件夹结构。无论网站放在服务器上的哪个位置,它都需要工作。考虑到这一点,我有两个问题:

1) 每当我包含 header.php 时,是否有一些 PHP 可以应用到文件路径的开头?我的网站将有许多子目录,而且每次我想要包含它时,在精神上遍历网站以指向它所在的文件夹太费时了。

2) 如何确保 header.php 中的导航链接始终正确?例如如果它是下面的一个目录,则返回主页的链接将是“../index.php”,但在其他任何地方都不起作用。

非常感谢您的帮助,谢谢。

【问题讨论】:

  • 网站的所有文件都在文档根目录下吗?
  • 我们解决了一个类似的问题,使用自动加载器调用将在多个脚本中使用的类,其中一些脚本位于不同的子目录中。尝试将你的 header.php 脚本放入一个类中,然后调用一个自动加载器,它大大简化了你的项目,并且你不需要在每个脚本中有 30 个要求来加载所有依赖项
  • @AdamForbis 是的,但是文档根目录在服务器上后会有所不同。所以我不能使用像 $_SERVER['DOCUMENT_ROOT'] 这样的东西。

标签: php html


【解决方案1】:

首先创建一个包含路径的 php 文件(将其命名为例如 ini.php 并将其放入文件夹 ini):

defined("YOUR_BASE_PATH")
    or define("YOUR_BASE_PATH", realpath(dirname(__FILE__) . '/..'));

然后在您的 header.php 中执行以下操作(包括包含您的路径定义的 ini 文件):

include_once(dirname(__FILE__) . "/ini/ini.php");
include_once(YOUR_BASE_PATH  . "/nocache.php");

现在您可以轻松地在项目中使用路径,没有任何麻烦! 相当不错的解决方案,只要更新ini文件就可以随意移动文件夹!

现在您已经这样设置了,您可以更改所有链接以使用实际路径:

<a href="<?php echo PathToUrl(YOUR_BASE_PATH . "/index.php"); ?>">test link</a>

在 header.php 中为 PathToUrl 创建一个简单的函数:

function PathToUrl($path)
{
    $path = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path)
    return $path;
}

应该可以的。

【讨论】:

  • 建议的解决方案适用于任意数量的子文件夹。您只需在文件夹结构中指定一个文件,该文件指定您可能使用的其他路径。
  • 使用 (dirname(FILE) 会导致 Chrome 控制台出现“不允许加载本地资源”错误消息。
【解决方案2】:

是的,通过使用 PHP 魔术常量。请尝试以下操作:

__DIR__

在字符串开头之前将其添加到包含链接中...示例:

require __DIR__ . "/file_name.php";

您可以在此处阅读更多信息: http://www.php.net/manual/en/language.constants.predefined.php

【讨论】:

  • __DIR__:文件所在目录。那么他们如何从目录中的任何位置访问 header.php 呢?例如嵌套子目录?如果他们在dir 中使用您的脚本,则__DIR__ 变量将为dir,如果在dir/subdir 中使用,则__DIR__ 将为dir/subdir
【解决方案3】:

使用魔法常数__DIR__...

来自 PHP 的文档:

DIR 文件的目录。如果在包含中使用,则返回包含文件的目录。这相当于 目录名(文件)。此目录名称没有尾部斜杠 除非是根目录。

然后像这样使用它:

$file = 目录 。 "/../somefile.txt";

此外,在 header.php(或任何其他始终首先加载的脚本中,您可以设置一个常量:

const PROJECT_DIR = __DIR__ . "/..";

然后总是参考PROJECT_DIR

2

这个很棘手:/我认为不可能,而且听起来也很不安全(如果您只需添加一堆..s就可以访问服务器上的所有文件,例如:../../../../../../../etc/passwd

祝你好运!

【讨论】:

  • 他们应该如何访问PROJECT_DIR 变量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2014-11-15
相关资源
最近更新 更多