Nginx с Node.js в качестве внутреннего сервера всегда возвращает код состояния 200 вместо 404 - PullRequest
0 голосов
/ 07 июля 2019

Я использую Nginx в качестве обратного прокси-сервера, а сервер Node.js Express - в качестве внутреннего.

При попытке загрузить пользовательскую страницу 404 в Express, 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;
        }

}

Как объяснено, я ожидал, что код состояния 404 будет возвращен из Nginx через внутренний сервер Node.js Express, но вместо этого я получаю код состояния 200, в чем тогда проблема?

Ответы [ 2 ]

0 голосов
/ 07 июля 2019

Оказывается, все работало правильно.Я забыл перезагрузить серверный процесс, и он выполнял старый код без кода состояния 404.Nginx действительно правильно перенаправляет код состояния 404, возвращаемый внутренним сервером Node.js Express.

0 голосов
/ 07 июля 2019

Nginx правильно возвращает 200, потому что вы запросили документ, который существует. Вы получите 404, только если запросите документ, который не существует. Попробуйте сделать это вместо этого. (А наличие такого документа на каком-либо другом сервере совершенно не имеет значения.)

когда вы перетягиваете свою страницу 404 в ее подлинном месте, она возвращает 200, потому что вы запросили страницу, которая существует.

для сервера Ngnix вы можете настроить NGINX, чтобы он указывал на эту страницу для подлинных ошибок 404. Как только это будет сделано, когда вы захотите перенаправить ваше приложение местами, просто перенаправьте их на поддельную страницу

...