Flask页面点击按钮调用PHP执行C++可执行文件报404如何解决?
问题核心原因
你当前使用Flask作为Web服务框架,Flask本身仅处理你代码中注册过的路由,默认不支持直接解析/响应PHP文件请求,即使callmyprogram.php和HTML文件放在同一目录,Flask匹配不到对应路由就会返回404错误。
解决方案
方案一:移除PHP中转,直接用Flask处理表单请求(更适配现有Flask架构,推荐)
这个方案不需要额外部署PHP运行环境,逻辑更简洁:
- 修改HTML表单的
action属性,指向Flask的自定义路由:
<form method="post" action="/flash"> <!-- 其余表单内容保持不变 --> </form>
- 在Flask启动文件(通常为
app.py)中新增对应路由,调用C++可执行文件:
from flask import Flask, request import subprocess import shlex app = Flask(__name__) # 原有其他路由保持不变 @app.route('/flash', methods=['POST']) def flash_program(): if request.method == 'POST': # 获取参数并做合法性校验 node_id = request.form.get('node_id', '').strip() file_name = request.form.get('file_name', '').strip() # 示例校验规则:node_id必须为数字,file_name不能包含路径符号、命令分隔符 if not node_id.isdigit() or '/' in file_name or ';' in file_name: return "参数不合法", 400 # 转义参数避免命令注入,执行C++程序 cmd = shlex.split(f"./Ex02_DriveStatus {node_id} {file_name}") result = subprocess.run(cmd, capture_output=True, text=True) # 可自定义返回内容 return f"执行完成,输出:{result.stdout}"
- 把C++可执行文件
Ex02_DriveStatus放在Flask项目根目录,同时赋予执行权限chmod +x Ex02_DriveStatus即可正常使用。
方案二:保留PHP逻辑,搭配支持PHP的Web服务器
如果你必须使用PHP中转,需要额外部署Nginx/Apache作为前置Web服务器,配置两类请求规则:
- 所有
.php后缀的请求转发给PHP-FPM处理 - 其余请求转发给Flask服务处理
额外排查要点: - 确认Web服务器的根目录配置和
callmyprogram.php存放路径一致 - 确认
callmyprogram.php文件权限设置正确,Web服务进程有读取权限 - 你当前编写的PHP代码存在语法错误:
$($_POST['node_id']多了一个$符号且缺少右括号,修正为$node_id = htmlentities($_POST['node_id']);,$file_name变量同理;同时建议用escapeshellarg()转义参数避免命令注入。
通用安全提醒
直接将用户输入作为命令行参数传入可执行文件存在极高的命令注入风险,无论用哪种方案都必须对用户输入做严格的合法性校验,禁止传入未过滤的特殊字符。
内容的提问来源于stack exchange,提问作者Camille Bouquet
相关产品推荐
相关产品推荐

