php相对路径和目录


php relative paths and directories

我想知道一些事情,但我似乎找不到一个好的、明确的答案,甚至找不到这个问题的解决方案:

我的PHP网站有以下结构:

root
   functions
   generators
   helpers
   scripts
   style
   index.php

这些都是文件夹和一个php文件。函数包含一组与数据库连接和各种其他数据库操作(如插入、删除、更新等(相关的php文件,。。。生成器包含用于自动生成网页以使其看起来完全相同的类。Helper是处理登录、注销、注册等的类。脚本是javascript,样式是CSS。

在我的generators文件夹中,有一个文件mainGenerator.php,它生成了网站的各个部分:

 private function generateLogin()
    {
        if (!isLoggedIn()) {
            echo "
                <h2>Login</h2>
                <form method='post' action='../helpers/login.php' id='loginForm'>
                <p>
                Username:<br/>
                <input class='search' type='text' name='username'/>
                Password:<br/>
                <input class='search' type='password' name='password'/>
                <input name='login' type='image' style='border: 0; margin: 0 0 -9px 5px;' src='style/login.png' alt='Login' title='Login'/><br/>
                No account yet? <a href='../register.php'>Register</a>
                </p></form>";
        } else {
            echo "
                <h2>Welome, <a href='user.php' style='color: #1293EE;'>" .
                 $_SESSION['user_name'] .
                 "</a></h2>
                <a href='logout.php'>Log off</a>";
        }
    }

这段代码在每个页面上生成登录框,或者在用户已经登录的情况下显示欢迎消息。正如你所看到的,操作引用了"../helpers/login.php",因为从这个生成器的角度来看,这是登录帮助程序的相对位置。

现在,问题是:如果我按下index.php上的登录按钮(http://example.com/ProjectName/index.php)它将我重定向到http://example.com/helpers/login.php并表示找不到该文件。

我知道问题出在哪里了,post-action看到来自index.php的请求,然后转到一个目录,然后查找/helpers/login.php,当然这并不存在。

修复方法可能是将操作更改为

action='/helpers/login.php'

但如果我需要从某个子目录中访问generateLogin((,我也会遇到同样的问题。。。如何解决这个特定的问题,即:对/helpers/login.php的引用保持正确,无论我从哪里尝试访问它。

action='/ProjectName/helpers/login.php'

假设你的根是http://localhost则上述链接应始终解析为http://localhost/ProjectName/helpers/login.php是否从调用http://localhost/ProjectName/index.php或http://localhost/ProjectName/subdir/index.php

如果你不想把"ProjectName"硬编码成许多不同的脚本,你可以使用一个全局变量并在配置文件中定义它:

helpers/ConfigOptions.php:

<?php
$ProjectName = "ProjectName";
?>

然后在脚本中,包括配置文件并使用您定义的变量:

index.php:

include $_SERVER['DOCUMENT_ROOT'] . '/helpers/ConfigOptions.php';
...
echo "
  <form action='/$ProjectName/helpers/login.php'>
  ....
";

有关DOCUMENT_ROOT的更多信息:

DOCUMENT_ROOT在服务器配置文件中定义,是执行脚本的文件系统上的根,而不是您将在浏览器中键入的网址。在上面的例子中,我假设文档根看起来像/home/user/www/ProjectName。如果DOCUMENT_ROOT仅为/home/user/www,则您可以将包含路径更改为:

include $_SERVER['DOCUMENT_ROOT'] . '/ProjectName/helpers/ConfigOptions.php';

或者使用相对路径。我会投票给后者,因为你不需要硬编码"ProjectName"。

所以include((和require((可以取任意一个:

  1. 文件的绝对路径
  2. 相对于当前执行脚本的路径。如果A包括B,B包括C,当B包括C时,它需要提供一个相对于A的路径

那么,您什么时候需要使用DOCUMENT_ROOT?通常使用的模板中,相对路径(如../helpers/file.php(可以解析为不同的绝对,具体取决于文件中包含的内容。在上面的例子中,index.php包含ConfigOptions.php,您可能不需要使用DOCUMENT_ROOT,因为index.php不是一个模板。为了安全起见,我还是用了它,但也许我在这里打开了一整罐虫子。我希望我没有把你弄糊涂。

如果你有一个以斜杠开头的链接,它总是被附加到根目录,而不是当前目录。。。

因此,如果你的页面是www.example.com/mySite/foo.html,并且你有这样的链接:<a href="/bar.html">Bar/<a>,用户将被重定向到www.example.com/bar.html。。。

您应该将表单操作指向helpers/login.php