PHP相对网址无效

时间:2015-06-01 19:20:02

标签: php html5 url

我一直在尝试在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.phpfooter.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

如果我需要包含任何内容,或者让任何更清楚的内容,请告诉我。

2 个答案:

答案 0 :(得分:1)

如果您的服务器文档根目录是/ usr / share / nginx / html,则可以使用$_SERVER['DOCUMENT_ROOT']

require $_SERVER['DOCUMENT_ROOT'].'/includes/header.php';

对于位于服务器根目录之外的数据库文件 - 最好将配置文件放在文档根目录之外,但可能是因为它有点过分,因为它没有差别,如果它&# 39;在根之外的一个级别或更多。为了访问数据库文件,我认为你有两个选择:

  1. 使用数据库文件的实际位置添加常量 - 这将是最简单的但会影响不同服务器之间的站点迁移,并且您需要记住在运行站点时更改它不同的制度。

  2. 将数据库文件更靠近文档根目录 - 让我们说一级,然后操纵从$_SERVER['DOCUMEN_ROOT']获得的字符串。

  3. 这里是一个示例,演示了当数据库文件从根目录上升一级时如何获取位置

    $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工作。

希望有所帮助!