我想知道一些事情,但我似乎无法找到一个好的,明确的答案,甚至是解决这个问题的方法:
我的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的引用都保持正确。
答案 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()将采用:
那么你什么时候需要使用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