php相对路径和目录

时间:2011-10-20 17:04:34

标签: php relative-path directory

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

我的PHP网站具有以下结构:

root
   functions
   generators
   helpers
   scripts
   style
   index.php

这些都是文件夹和一个php文件。函数包含一堆与数据库连接相关的op php文件和各种其他数据库操作,如插入,删除,更新......生成器包含自动生成网页的类,使它们看起来完全相同。助手是处理登录,注销,注册等的类。脚本是javascript,Style是CSS。

在我的generator文件夹中,有一个文件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”,因为这是从这个生成器的角度来看loginhelper的相对位置。

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

我看到问题是什么,post动作看到来自index.php的请求并上升到一个目录,然后查找/helpers/login.php,当然不存在。

修复可能是将操作更改为

action='/helpers/login.php'

但是如果我需要从某个子目录中访问generateLogin(),那就会给我带来同样的问题... 如何解决这个特殊问题,即:无论我在哪里尝试访问它,对/helpers/login.php的引用都保持正确。

2 个答案:

答案 0 :(得分:10)

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

假设你的root是http://localhost,那么无论是http://localhost/ProjectName/helpers/login.php还是http://localhost/ProjectName/index.php

,上述链接都应始终解析为http://localhost/ProjectName/subdir/index.php

如果您不想将“ProjectName”硬编码到许多不同的脚本中,可以使用全局变量并在配置文件中定义它:

<强>助手/ 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 的路径。
  3. 那么你什么时候需要使用DOCUMENT_ROOT?通常使用模板,其中相对路径(如../helpers/file.php)可以解析为不同的绝对路径,具体取决于文件的内容。在上面的示例中,index.php包含ConfigOptions.php,您可能不需要使用DOCUMENT_ROOT,因为index.php不是模板。无论如何我使用它是安全的,但也许我在这里打开了一整套蠕虫。我希望我不要再混淆你了。

答案 1 :(得分:2)

如果您的链接以斜杠开头,那么总是会被附加到根目录而不是当前目录...

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

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