![](/img/trans.png)
[英]How to get/set correct relative paths in PHP with a lot of directories?
[英]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()将采用:
那你什么时候需要使用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.