Как заставить CGIHTTPRequestHandler выполнять мои PHP-скрипты с данными POST

В настоящее время я пытаюсь делать простые веб-материалы с модулем http.server в Python. Когда я пытаюсь отправить форму в свой скрипт, он не получает данные POST, $_POSTпусто и file_get_contents('php://input')также.

Это мое post_test.html:

      #!/usr/bin/php

<!DOCTYPE html>
<html>
<body>

<form method="post" action="post_test.html">
  Name: <input type="text" name="fname">
  <input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // collect value of input field
    echo "RAW POST: " . file_get_contents('php://input') . "<br>";
    $name = $_POST['fname'];
    if (empty($name)) {
        echo "Name is empty";
    } else {
        echo $name;
    }
}
?>

</body>
</html>

А это мой серверный скрипт:

      import urllib.parse
from http.server import CGIHTTPRequestHandler, HTTPServer

hostName = "localhost"
serverPort = 8080

handler = CGIHTTPRequestHandler
handler.cgi_directories.append('/php-cgi')


class MyServer(handler):

    def do_GET(self):
        # get path without first '/' and without anything besides path and filename
        file = self.path[1:].split("?")[0].split("#")[0]
        # if the file is in the script list, execute from php-cgi, else load from webapp
        php_handle = ["post_test.html"]
        if file in php_handle:
            self.path = "/php-cgi" + self.path
        else:
            self.path = "/webapp" + self.path
        CGIHTTPRequestHandler.do_GET(self)

    def do_POST(self):
        # get path without first '/' and without anything besides path and filename
        file = self.path[1:].split("?")[0].split("#")[0]
        # if the file is in the script list, execute from php-cgi
        php_handle = ["post_test.html"]
        if file in php_handle:
            length = int(self.headers['Content-Length'])
            post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))
            for key, data in post_data.items():
                self.log_message(key + ": " + str.join(", ", data))

            self.path = "/php-cgi" + self.path
            CGIHTTPRequestHandler.do_POST(self)

    def do_HEAD(self):
        CGIHTTPRequestHandler.do_HEAD(self)


if __name__ == "__main__":
    webServer = HTTPServer((hostName, serverPort), MyServer)
    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass
    webServer.server_close()
    print("Server stopped.")

1 ответ

Хорошо, я наконец смог решить проблему: #!/usr/bin/phpнеправильно, так и должно быть #!/usr/bin/php-cgi.

Причина: phpНЕ использует данные POST, и нет возможности передать их php. создан для веб-сервера и может с этим справиться.

Как решить следующую проблему: для успешного запуска вам необходимо создать php.ini в текущем каталоге с двумя настройками. Первый, чтобы разрешить его выполнение напрямую, второй, чтобы установить каталог, в котором находятся скрипты. Если вы не установите его, вас встретит 404 not found.

php.ini:

      cgi.force_redirect = 0
doc_root = /home/username/server-directory

Где server-directoryпапка — это папка, содержащая php.ini, а php-cgiпапка. Также имя папки не связано с двоичным файлом php-cgi, это просто плохое имя, которое я сделал.

Если вы попытаетесь воссоздать это, теперь все должно работать идеально.

Другие вопросы по тегам