我将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状态代码,那又是什么问题?
答案 0 :(得分:0)
Nginx正确返回200,因为您要求提供一个存在的文档。如果您请求的文档不存在,则只会得到404。尝试这样做。 (以及是否在其他服务器上存在这样的文档是完全无关的。)
当您将404页面拉到原本的位置时,它会返回200,因为您请求的页面确实存在。
对于Ngnix服务器,您可以将NGINX配置为指向该页面以查看真正的404错误。完成此操作后,当您想在地方重定向应用程序时,只需将其重定向到伪造的页面
答案 1 :(得分:0)
结果显示一切正常。我忘记了重新加载服务器进程,并且它正在运行没有404状态代码的旧代码。 Nginx确实确实正确转发了后端Node.js Express服务器返回的404状态代码。