AJAX发送POST请求到PHP文件报错但GET可下载该文件是什么原因?
你的猜测完全正确,这个问题就是express.static中间件的特性导致的。
express.static 是Express专门用于托管静态资源的中间件,默认仅响应GET和HEAD两种请求,你发送的POST请求不会被该中间件处理,而你又没有为/app/preload.php路径配置单独的POST路由,所以服务端直接返回404错误。
你直接在浏览器地址栏访问该地址时,浏览器默认发送的是GET请求,符合express.static的处理规则,所以会把PHP文件当成普通静态资源返回给你,你才能下载到文件。但这里还存在另一个隐患:你当前的Node服务没有配置PHP解析逻辑,就算你解决了POST请求的问题,返回的也是PHP源代码,而不是代码运行后输出的JSON结果,完全达不到业务需求。
可选解决方案
- 方案一:替换成Node实现接口(推荐)
把preload.php中的业务逻辑直接用Node.js重写,单独配置POST路由处理对应请求,示例代码如下:
首先需要先配置JSON参数解析中间件(放在所有路由定义之前):
app.use(express.json())
再新增POST路由:
app.post('/app/preload.php', (req, res) => { // 从req.body中获取前端传的id、directories参数 const { id, directories } = req.body // 这里替换成原来PHP中的业务处理逻辑 const result = 你的业务处理函数(id, directories) // 返回JSON结果给前端 res.json(result) })
方案二:保留PHP代码,配置反向代理
如果不想修改原有PHP代码,可以部署一个支持PHP解析的服务(比如Apache、PHP-FPM),再用Nginx做反向代理,把/app路径下的所有请求转发到PHP服务上处理,不要用express.static托管PHP文件。临时验证方案
如果只是想验证是否是POST请求导致的404,可以把AJAX请求的type参数改成GET测试,注意该方式仅用于验证问题,无法正常拿到PHP运行后的结果。
内容的提问来源于stack exchange,提问作者Sara Ree
相关产品推荐
相关产品推荐

