按照本教程创建安全登录系统,我遇到了这个问题。
在第7/8部分:创建HTML页面中,第1节创建登录表单(index.php),它使用:<form action="includes/process_login.php" method="post" name="login_form">
尽管在教程的前面它说(第3部分,8,第1节,第一段):
所以我的包含文件夹不是在/var/www/html/mysite/或/var/www/html/,而是在/var/www/,我的表单变成:在生产环境中,您可能需要定位该文件所有其他包含文件,在web服务器的文档之外根。如果你这么做了,我们强烈建议你这么做,你就会成功需要根据需要修改include或require语句,以便应用程序可以找到包含文件。
<form action="../../includes/process_login.php" method="post" name="login_form">
(适用于PHP的include)。但是这个不行,我得到这个错误:
http://localhost/includes/process_login.php请求的URL/includes/process_login.php在此服务器上找不到。
为什么它的行为,如果我的包括是在/var/www/html/?我用
检查了所有的/var/www/文件夹grep -rnw . -e 'process_login.php'
,这是唯一出现的字符串(带../../)。我错过了什么?
不管怎样,我还是想知道为什么需要这个。
你必须明白html文件是"执行"的。在客户端,这意味着如果您链接到HTML文件中高于公共文件夹(客户端认为是根文件夹)的内容,则客户端无法到达它,因为它对客户端不可用。客户端无法发送请求到web服务器没有提供给它的文件夹
但是php脚本是在服务器端执行的,这意味着它可以访问比html感知到的根目录更高的文件夹。
基本上:html认为根目录是公用文件夹,php认为根目录是实际的服务器根目录
我找到了一个解决方法,即包含一个文件,该文件只包含另一个文件,第一个在公共文件夹中,第二个在隐藏文件夹中。
的形式:
<form action="process_login.php" method="post" name="login_form">
第一个文件(public_folder/mysite/process_login.php):
<?php
include '../../includes/process_login.php';
第二个文件(. ./. .//process_login.php)包括:
<?php
include_once 'db_connect.php';
include_once 'functions.php';
sec_session_start(); // Our custom secure way of starting a PHP session.
if (isset($_POST['email'], $_POST['p'])) {
$email = $_POST['email'];
$pwd = $_POST['p']; // The hashed password.
if (login($email, $pwd, $conn) == true) {
// Login success
header('Location: ../coisas/protected_page.php');
} else {
// Login failed
header('Location: ../coisas/index.php?error=1');
}
} else {
// The correct POST variables were not sent to this page.
echo 'Invalid Request';
}
无论如何,我还是想知道为什么需要这个