首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使CGIHTTPRequestHandler使用POST数据执行我的PHP脚本

如何使CGIHTTPRequestHandler使用POST数据执行我的PHP脚本
EN

Stack Overflow用户
提问于 2022-04-11 14:57:13
回答 1查看 99关注 0票数 1

目前,我正试图使用Python中的http.server模块做一些简单的web操作。当我试图向脚本发布表单时,它也不会接收POST数据、$_POST ist空和file_get_contents('php://input')

这是我的post_test.html

代码语言:javascript
复制
#!/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>

这是我的服务器脚本:

代码语言:javascript
复制
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.")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-11 19:46:14

好的,我终于解决了这个问题:#!/usr/bin/php错了,应该是#!/usr/bin/php-cgi

原因php不使用POST数据,也无法将其提供给php。php-cgi是为了and服务器的目的而制作的,并且可以处理它。

Hwo要解决下一个问题,:要成功运行php-cgi,必须在当前目录tho中创建一个具有两个设置的php.ini。第一个允许直接执行它,第二个允许设置脚本所在的目录。如果你不设置它,你会受到一个404 not found的欢迎。

php.ini

代码语言:javascript
复制
cgi.force_redirect = 0
doc_root = /home/username/server-directory

其中server-directory文件夹是包含php.ini的文件夹和php-cgi文件夹。此外,文件夹的名称与php-cgi二进制文件无关,只是命名错误。

如果你想重新创建它,它现在应该工作得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71830012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档