【问题标题】:Nginx with Node.js as backend server always returns status code 200 instead of 404使用 Node.js 作为后端服务器的 Nginx 总是返回状态码 200 而不是 404
【发布时间】:2019-07-07 20:03:25
【问题描述】:

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

当尝试在 Express 上加载定制的 404 页面时,Nginx 总是返回 200 状态码,即使 Express 正确地向 Nginx 发送回 404 状态码。

配置有什么问题?

我也使用 EJS 作为模板引擎,但是,我认为它不会导致问题。我使用 PM2 作为进程管理器来运行服务器。我在没有使用 Nginx 作为反向代理的情况下进行了测试,Express 中的一切似乎都运行良好,即 Express 正确返回了 404 状态码。

这是我的快递代码:

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 状态码,那么问题出在哪里?

【问题讨论】:

    标签: node.js express nginx ejs


    【解决方案1】:

    Nginx 正确返回 200,因为您要求的文档存在。如果您请求的文档不存在,您只会收到 404。尝试这样做。 (并且这样的文档是否存在于其他服务器上完全无关紧要。)

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

    对于 Ngnix 服务器,您可以将 NGINX 配置为指向该页面以发现真正的 404 错误。完成后,当您想将应用重定向到某个地方时,只需将它们重定向到虚假页面

    【讨论】:

    • Nginx不应该转发Node.js返回的404状态码吗?例如,到达不存在的页面“/pokdspoijopihspdkjl.html”也应该返回 404 状态代码,因为这正是在不使用 Nginx 作为反向代理的 Node.js 中发生的情况。
    • 对于不在自身内部的路径和请求,它会返回 404 错误,因为它本身就是服务器。但是对于节点,请求是正确的并收到了答案,然后返回带有 200 代码的结果。您可以处理整个错误和标题并将其放入结果的正文中。
    • 在节点 js 中还是在 Ngnix 服务器中?
    • 没关系,事实证明一切正常。我忘记重新启动服务器进程,它正在运行没有 404 状态代码的旧代码。 Nginx 确实正确转发了服务器返回的 404 状态码。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 2021-12-18
      • 1970-01-01
      • 2016-02-10
      • 2019-02-21
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多