目前,我正试图使用Python中的http.server模块做一些简单的web操作。当我试图向脚本发布表单时,它也不会接收POST数据、$_POST ist空和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.")发布于 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
cgi.force_redirect = 0
doc_root = /home/username/server-directory其中server-directory文件夹是包含php.ini的文件夹和php-cgi文件夹。此外,文件夹的名称与php-cgi二进制文件无关,只是命名错误。
如果你想重新创建它,它现在应该工作得很好。
https://stackoverflow.com/questions/71830012
复制相似问题