我编写了一个 NodeJS 应用程序,它使用带有以下域的包express
:和。express-subdomain
api.localhost
localhost
我正在尝试使用 NGINX 作为反向代理来处理对应用程序的请求,但我的子域正在返回完整域的内容。我无法弄清楚问题出在哪里 - 有什么想法吗?
当我没有使用 NGINX 和 HTTPS 时,它似乎按预期工作;但我希望这两者都具有 HTTPS,而无需购买通配符证书(现在我正在使用 certbot,我认为它需要一种为每个域定义不同证书的方法)
我的router.ts
NodeJS 应用程序文件:
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_pass
http://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);
});