Как заставить 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, это просто плохое имя, которое я сделал.
Если вы попытаетесь воссоздать это, теперь все должно работать идеально.