NestJS重定向HTTP到HTTPS/强制SSL

4

构建NestJS应用程序,我希望将所有传入的流量路由通过https,而不会给用户带来不便。

目前有两种方法我知道,但都不能满足我的要求。

  1. 为http和https设置两个服务器,并根据路由/ api端点重定向流量,这真的不是DRY,也不是最佳实践。文档重定向

  2. 仅创建https服务器,用户始终会被强制手动输入https地址,这不是我想要的。文档https

理想情况下,我认为当有人第一次输入example.com时,就应该立即检查并强制进行https。 我认为这最好在我的NestJS应用程序的main.ts中完成。


你可以在nginx层面轻松实现这个。这个解决方案对你来说足够好吗? - Przemyslaw Jan Beigert
我不太熟悉nginx,目前我是通过node main.js来提供我的nestjs构建的,没有什么花哨的东西。如果有所改进并能带来好处,我很乐意进行更改。 - FuzzyTemper
2个回答

5

针对我的使用情况,我认为没有必要在服务器上添加反向代理层,因为node http服务器已经拥有完整的功能。由于问题与NestJS相关,这里我提供一个简单的原生解决方案,使用Nest中间件。当然,您还需要遵循NestJS文档中有关托管两个服务器的说明,这也是相当简单的。

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();
        }
    }
}

我们只需在请求对象上询问连接是否安全,如果不安全,则激励浏览器永久重定向到相同的URL,但这次在前缀中加上https://。 然后,将以上中间件类注册到AppModuleconfigure()方法中的所有路由中。
configure(consumer: MiddlewareConsumer)
{
    consumer.apply(HttpsRedirectMiddleware).forRoutes("*");
}

5

对于生产发布,您可能会使用nginx。 Nginx将侦听端口80并重定向到nestJS端口。 这种解决方案的优点是可以轻松地重定向到https。 在您的配置中,您可以放置类似于以下内容的内容

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;
       ...
}

所以每个http请求都会被重定向到https。你的应用程序不需要关心http请求,因为它们都将在之前被重定向。

所以基本上我可以用Apache服务器做同样的事情吗?我已经设置好了一个。 - FuzzyTemper
是的,这两个解决方案非常相似。您也可以在Apache上定义重定向。 - Przemyslaw Jan Beigert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接