我一直在尝试在PHP中设置一个模板标题,用于我的所有页面。但是,当我尝试使用根相对路径时,我收到了几个错误。我已经查看了其他几个问题,并且无法通过它们解决我的问题(通常是因为我无法掌握他们的目录设置;因此我的图表)。我的设置是运行LEMP堆栈的Ubuntu 14.04服务器。在我的default.conf
文件中,我按如下方式设置了我的文档根目录:
root /usr/share/nginx/html;
index index.php index.html index.htm;
目录结构:
...
|
|
+--ETC
| |
| +--NGINX
| | |
| | +--sites-available
| | |
| | +--default.conf
| |
| +--PHP5
| |
| +--FPM
| |
| +--php.ini
|
+--HOME
| |
| +--ADMIN
| |
| +--database.php
|
+--USR
|
+--SHARE
|
+--NGINX
|
+--[HTML]
|
+--INCLUDES
| |
| +--header.php
| |
| +--footer.php
|
+--PAGES
| |
| +--contact_us.php
|
+--index.php
+--database.txt
的index.php
<?php require "includes/header.php" ?>
...
<? php require "includes/footer.php" ?>
这些链接没有根相对路径...
的header.php
<!DOCTYPE html>
<head> ... </head>
<body>
<?php require ("../../../../home/admin/database.php") ?>
<header>
...
<a href="/index.php">Home</a>
...
<a href="/pages/contact_us.php">Contact Us</a>
...
</header>
</body>
......但这些必须。如果它们被切换,两者都会崩溃。另外,我不知道如何更好地执行上面的require
语句,因为它在文档根目录之上,而且我不确定它可以从哪里调用。有没有办法访问“服务器”根,而不仅仅是“文档”根“?
contact_us.php
<?php require "/includes/header.php"; ?>
....
<?php require "/includes/footer.php"; ?>
...与此页面相同。
如您所见,我使用了几种不同类型的URL,其中大多数是根相对路径。但是,如果我尝试在index.php
文件中使用根相对路径,则会出现空白屏幕,因为它无法找到header.php
和footer.php
文件(这是必需的)。
我在其他页面上也没有任何好转。在我的header.php
文件中,您会注意到我的标题中包含contact_us.php
页面的网址。但是,当我在索引页面上启动并单击“联系我们”页面的链接时,我收到此错误,即使我确实正确地拼写了相对路径(请记住,“html”文件夹是我的根目录)。
Warning: require(/includes/header.php): failed to open stream: No such file or directory in /usr/share/nginx/html/pages/contact_us.php on line 4`
Fatal error: require(): Failed opening required '/includes/header.php' (include_path='.:/usr/share/php:/usr/share/pear') in /usr/share/nginx/html/pages/contact_us.php on line 4`
基本上,我想要的是确保我的所有网址都从同一个地方开始。我知道使用../
有时会更快,但由于我的许多网页都有include
个语句,因此这些网址很快就会被破坏。有没有办法从可以在任何页面上工作的根目录开始,无论它在网站上的哪个位置,或从哪里调用?
编辑:我刚刚尝试了卢平下面提出的“<?php require $_SERVER["DOCUMENT_ROOT"] . "/includes/header.php"; ?>
”想法。虽然这确实有点父亲(背景颜色加载),然后它崩溃并说出此错误消息:
Warning: require(../../../../home/admin/database.php): failed to open stream: No such file or directory in /usr/share/nginx/html/includes/header.php on line 30
Fatal error: require(): Failed opening required '../../../../home/admin/database.php' (include_path='.:/usr/share/php:/usr/share/pear') in /usr/share/nginx/html/includes/header.php on line 30
P.S。为了清楚起见,我的文档根目录为/usr/share/nginx/html
。
如果我需要包含任何内容,或者让任何更清楚的内容,请告诉我。
答案 0 :(得分:1)
如果您的服务器文档根目录是/ usr / share / nginx / html,则可以使用$_SERVER['DOCUMENT_ROOT']
require $_SERVER['DOCUMENT_ROOT'].'/includes/header.php';
对于位于服务器根目录之外的数据库文件 - 最好将配置文件放在文档根目录之外,但可能是因为它有点过分,因为它没有差别,如果它&# 39;在根之外的一个级别或更多。为了访问数据库文件,我认为你有两个选择:
使用数据库文件的实际位置添加常量 - 这将是最简单的但会影响不同服务器之间的站点迁移,并且您需要记住在运行站点时更改它不同的制度。
将数据库文件更靠近文档根目录 - 让我们说一级,然后操纵从$_SERVER['DOCUMEN_ROOT']
获得的字符串。
这里是一个示例,演示了当数据库文件从根目录上升一级时如何获取位置
$x = rtrim($_SERVER['DOCUMENT_ROOT'], '\/');
$x = substr($x, 0, (strrpos($x, '/')+1));
$x = $x.'/folder/database.php';
答案 1 :(得分:1)
问题在于,当您将require函数与根路径一起使用时,PHP不会将您的项目或Web根目录视为根目录,而是引用系统的根目录!
请求require('/includes/header.php')
时,您实际上是在请求:
/includes/header.php
而不是你想要的:
/usr/share/ngix/html/includes/header.php
所以 - 为了解决这个问题,我们想要一些总是指向你的服务器网站根目录的常量 - 就像你在nginx中定义的一样。这是$_SERVER['DOCUMENT_ROOT']
派上用场的地方
http://php.net/manual/en/reserved.variables.server.php
只要正确配置了PHP / nginx,就应该指向/usr/share/nginx/html
。
将您的要求更改为:
<?php require($_SERVER['DOCUMENT_ROOT'] . 'includes/header.php'); ?>
应该这样做。
小心不要混淆URL和系统路径 - PHP认为系统路径方面,你的HTML将按照URL工作。
希望有所帮助!