typescript - NestJS omdirigera HTTP till HTTPS/tvinga SSL
Bygga en NestJS-applikation Jag vill routa ALL inkommande trafik via https utan besvär för användaren.
Hittills finns det två sätt jag känner till, båda passar inte mina krav.
Ställ upp två servrar för http och https och sedan omdirigera trafik per route/api-endpoint, vilket verkligen inte är DRY och inte kan vara bästa praxis. Doc omdirigering
Genom att endast skapa https-servern skulle användaren alltid tvingas skriva https-adressen manuellt, vilket jag inte vill. Doc https
I idealfallet skulle jag anta en lösning där https kontrolleras och tvingas vid första ögonblicket någon besöker servern genom att bara skriva example.com. Jag tror att detta bäst skulle göras i main.ts i min NestJS-applikation.
Svar #1
För mitt användningsfall ser jag ingen anledning att göra servern tung med ett omvänt proxy-lager medan node http-servrar är fullfjädrade. Eftersom frågan är relaterad till NestJS, presenterar jag här en enkel inbyggd lösning, med hjälp av Nest-middleware. Naturligtvis måste du också följa NestJS-dokumentationen om att köra två servrar, vilket återigen är ganska enkelt.
import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from "express";
@Injectable()
export class HttpsRedirectMiddleware implements NestMiddleware
{
use(req: Request, res: Response, next: () => void)
{
if (!req.secure)
{
const httpsUrl = `https://${req.hostname}${req.originalUrl}`;
res.redirect(HttpStatus.PERMANENT_REDIRECT, httpsUrl);
}
else
{
next();
}
}
}
Vi frågar helt enkelt på förfrågningsobjektet om anslutningen är säker, om inte, uppmanar vi webbläsaren att permanent omdirigera till samma url, men denna gång med prefixet https://. Mellanprogramklassen ovan ska sedan registreras för alla rutter inom configure()-metoden i AppModule.
configure(consumer: MiddlewareConsumer)
{
consumer.apply(HttpsRedirectMiddleware).forRoutes("*");
}
Svar #2
För produktionsrelease kommer du förmodligen att använda nginx. Nginx kommer att lyssna på port 80 och omdirigera till nestJS-porten. Fördelen med denna lösning är enkel omdirigering till https. I din konfiguration kan du sätta något som detta
server {
listen 80;
server_name example1.com example2.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example1.com example2.com;
...
}
Så varje HTTP-förfrågan kommer att omdirigeras till HTTPS. Och din applikation behöver inte bry sig om HTTP-förfrågningar eftersom varje av dem kommer att omdirigeras innan.
