我可以发送一个表单动作到公共文件夹外的php文件


Can I send a form action to php file outside public folder?

按照本教程创建安全登录系统,我遇到了这个问题。

在第7/8部分:创建HTML页面中,第1节创建登录表单(index.php),它使用:
<form action="includes/process_login.php" method="post" name="login_form">

尽管在教程的前面它说(第3部分,8,第1节,第一段):

在生产环境中,您可能需要定位该文件所有其他包含文件,在web服务器的文档之外根。如果你这么做了,我们强烈建议你这么做,你就会成功需要根据需要修改include或require语句,以便应用程序可以找到包含文件。

所以我的包含文件夹不是在/var/www/html/mysite/或/var/www/html/,而是在/var/www/,我的表单变成:
<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';
}

无论如何,我还是想知道为什么需要这个