使用Node.js作为后端服务器的Nginx始终返回状态码200而不是404

时间:2019-07-07 09:50:14

标签: node.js express nginx ejs

我将Nginx用作反向代理,并使用Node.js Express服务器作为后端。

尝试在Express上加载定制的404页面时,即使Express正确地将404状态代码发送回Nginx,Nginx始终返回200状态代码。

配置有什么问题?

我还将EJS用作模板引擎,但是,我认为它不会导致问题。我使用PM2作为进程管理器来运行服务器。我已经在不使用Nginx作为反向代理的情况下进行了测试,并且Express中的所有功能似乎都可以正常工作,即Express正确返回了404状态代码。

这是我的Express代码:

const path = require('path')

const express = require('express')

const app = express()

const port = process.argv[2] || 3000

// Define paths for Express config
const publicDirPath = path.join(__dirname, '../public')
const viewsPath = path.join(__dirname, '../templates/views')

// Set EJS engine and views location
app.set('view engine', 'ejs')
app.set('views', viewsPath)

// Set static files location
app.use(express.static(publicDirPath))

app.get('/testing404', (req, res) => {
    res.status(404).render('404', {
        title: '404 error',
        content: 'This is a 404 error page.'
    })
})

app.listen(port, () => {
    console.log('Server started at port ' + port + '!')
})

这是我相关的Nginx配置:

upstream nthreads {
    ip_hash;
    server localhost:3000;
}

server {

        root /var/www/[XXXXX]/html;
        index index.html index.htm index.nginx-debian.html;

        server_name [XXXXX] www.[XXXXX];

        location / {
                proxy_pass http://nthreads;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }

}

如前所述,我希望Nginx通过Node.js Express后端服务器返回404状态代码,但我却得到了200状态代码,那又是什么问题?

2 个答案:

答案 0 :(得分:0)

Nginx正确返回200,因为您要求提供一个存在的文档。如果您请求的文档不存在,则只会得到404。尝试这样做。 (以及是否在其他服务器上存在这样的文档是完全无关的。)

当您将404页面拉到原本的位置时,它会返回200,因为您请求的页面确实存在。

对于Ngnix服务器,您可以将NGINX配置为指向该页面以查看真正的404错误。完成此操作后,当您想在地方重定向应用程序时,只需将其重定向到伪造的页面

答案 1 :(得分:0)

结果显示一切正常。我忘记了重新加载服务器进程,并且它正在运行没有404状态代码的旧代码。 Nginx确实确实正确转发了后端Node.js Express服务器返回的404状态代码。