繁体   English   中英

php相对路径和目录

[英]php relative paths and directories

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

我的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的引用保持正确,无论从哪里来我尝试访问它。

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

假设你的root是http:// localhost,那么上面的链接应该总是解析为http://localhost/ProjectName/helpers/login.php,无论是从http://localhost/ProjectName/index.php还是http://调用它本地主机/项目名/子目录/ 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在服务器配置文件中定义,是执行脚本的文件系统的根, 而不是您在浏览器中键入的Web地址。 在上面的例子中,我假设文档根看起来像/ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM