繁体   English   中英

Express POST在Apache上返回404

[英]Express POST returns 404 on Apache

有一个React应用程序可以向Mongodb明确请求api / login信息,并对照它检查密码输入,否则,您将无法访问该网站。

在本地,一切正常。 当我们将所有构建文件移至apache服务器时,控制台将返回POST https://websitepath.com/api/login 404(未找到)

在此处输入图片说明

关于什么可能是问题以及为什么它在本地有效但在apache上无效的任何想法? 已安装节点,Express已在端口4000上成功运行。

这是index.js的代码

var express = require('express');
var bodyParser= require('body-parser')
var MongoClient = require('mongodb').MongoClient
var sha1 = require('sha1');
var db;

const PORT = 4000;
var app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));


app.use('/api/login', function (req, res) {

  if (!req.body.password) return res.status(400).send('bad_request!')

  db.collection('user').find().toArray(function(err, results) {
    if (err) return res.status(500).send('something_wrong!');

    var checker = false;

    results.forEach(function (entry) {
      if (entry.password === sha1(req.body.password)) checker = true;
    })

    if (checker) {
      res.send('success')
    } else {
      return res.status(403).send('Unfortunately password is incorrect. Please try again.');
    }
  })
})

MongoClient.connect('mongodb://localhost:27017/test', (err, database) => {
  if (err) return console.log(err)
  db = database
  app.listen(PORT, function() {
    console.log('Express server is up on port ' + PORT);
  });
})

这是AuthService.js的代码

 import axios from 'axios';
import qs from 'qs';

const AuthService = {
  isLogged: false,
  login(data, cb) {

    axios.post('/api/login',  qs.stringify(data)).then(
      (res) => {
        this.isLogged = true;
        cb(null, res);
      }
    ).catch((error) => {
      console.error('error occured', error);
      cb(error.response.data);
    })
  },
}

export default AuthService;

您的问题没有提到代理node.js应用程序,因此我猜这就是问题所在-特别是,没有代理该节点应用程序。

简而言之,您似乎想做的事情是这样的:

Apache正在监听端口443(HTTPS端口),并在各种路径(大概是除以/api开头的路径之外的所有路径)上提供网页。

您希望Web服务器还在端口443上提供您的node.js API使用的路径(例如/api/login等)。

但是,两个不同的应用程序(Apache和您的node.js应用程序)无法同时监听端口443-Apache对其进行绑定并提供自己的页面。 如果尝试更改node.js应用程序上的端口,它将无法启动,并显示错误消息,表明端口443已被另一个应用程序绑定。

为此有一个简单的测试:导航至http://websitepath.com:4000/api/login 如果您可以看到您的API登录页面(即node.js应用程序正在侦听端口4000上),则意味着问题不在于您的节点应用程序,而是Apache的代理配置。

解决方案是将Apache设置为代理 这将允许Apache服务于其自己的页面,并根据路径将请求转发至另一服务。 因此,您当然可以进行设置,以便将以/api/...开头的路径转发到http://localhost:4000/api/...而其他任何路径都由Apache直接提供。

设置代理并不十分困难,但这在很大程度上取决于您的具体情况,因此,我不会尝试解释所有的来龙去脉。 我建议从mod_proxy文档开始。 还有大约一百万个教程。 Digital Ocean的文档很好-我过去曾经使用过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM