NGNIX 反向代理 NodeJS 子域名返回域名

NGNIX 反向代理 NodeJS 子域名返回域名

我编写了一个 NodeJS 应用程序,它使用带有以下域的包express:和。express-subdomainapi.localhostlocalhost

我正在尝试使用 NGINX 作为反向代理来处理对应用程序的请求,但我的子域正在返回完整域的内容。我无法弄清楚问题出在哪里 - 有什么想法吗?

当我没有使用 NGINX 和 HTTPS 时,它似乎按预期工作;但我希望这两者都具有 HTTPS,而无需购买通配符证书(现在我正在使用 certbot,我认为它需要一种为每个域定义不同证书的方法)


我的router.tsNodeJS 应用程序文件:

import * as express from 'express';
import * as subdomain from 'express-subdomain'; // See subdomain package

import { UserRoutes } from './User';
import { AuthRoutes } from './Auth';

export class Router {
    static routeAPI(app) {
        const router = express.Router();

        router.use((req, res, next) => {
            res.header('Access-Control-Allow-Origin', '*');
            res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
            res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
            next();
        });

        AuthRoutes.route(router);
        UserRoutes.route(router);

        app.use(subdomain('api', router)); // App uses subdomain
    }
}

我的api.localhost网站配置文件:

server {
    listen 80;

    server_name api.localhost;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;

    server_name api.localhost;
    access_log /var/log/nginx/api.localhost.log;

    ssl_certificate /etc/letsencrypt/live/api.localhost/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.localhost/privkey.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    location / {
        proxy_pass http://localhost:8080;
        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;
    }
}

我尝试过:

  • 改成proxy_passhttp://api.localhost:8080
  • proxy_set_header Host编码api.localhost
  • 使用$http_host而不是$host

注意:localhost仅用作示例域

答案1

似乎我的server.js静态文件在我的路线之前被声明,所以它们首先被击中。


这表示web/dist当网络服务器位于以下位置时使用/

this.app.use('', express.static('web/dist'));

这是在我的路线之前声明的:

Router.routeAPI(this.app);

/** Catch errors */
this.app.use((req, res, next) => {
    res.status(404);

    return res.json('Howdy');
});

this.app.use((err, req, res, next) => {
    if (res.headersSent) {
        return next(err);
    }

    if (err instanceof Response) {
        return res.status(err.status).json(err.toJSON());
    }

    return res.status(500).json(err);
});

相关内容