如何将HTTPS流量重定向到localhost:443上的代理?

时间:2019-12-05 02:14:57

标签: c++ http https network-programming mongoose-web-server

我正在使用Cesanta Mongoose c ++网络库在C ++中构建HTTP服务器。本质上,我试图将流量从Web浏览器重定向到localhost上的代理。我最近通过购买证书和域并按照说明启用猫鼬(https://cesanta.com/docs/http/ssl.html)的说明,添加了对HTTPS的支持。服务器现在正在侦听端口443,并且运行良好。我已经将Web浏览器配置为将HTTPS请求定向到localhost:443,但它似乎并未触发HTTP服务器。当我的服务器在端口8080上侦听并且将Web浏览器配置为将请求发送到localhost:8080时,它会触发Web浏览器,但不支持https。配置Web浏览器以将请求发送到localhost:443是否有问题?

1 个答案:

答案 0 :(得分:0)

ngrok 解决方案非常好。

如果您想直接在应用程序中添加重定向,请设置两个侦听连接:一个 HTTP,一个 HTTPS。

为这两个监听连接使用不同的事件处理函数:HTTP 处理程序只会发送重定向,而 HTTPS 处理程序会做真正的工作:

static void f1(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
  if (ev == MG_EV_HTTP_MSG) {
    struct mg_http_message *hm = (struct mg_http_message *) ev_data;
    struct mg_str *host = mg_http_get_header(hm, "Host");
    if (host == NULL) {
      mg_printf(c, "HTTP/1.1 500 Failed\r\n\r\n");
    } else {
      mg_printf(c, "HTTP/1.1 301 Moved\r\n"
                   "Location: https://%.*s%.*s\r\n\r\n",
                   (int) host->len, host->ptr,);
                   (int) hm->uri.len, hm->uri.ptr);  // Send redirect to HTTPS!
    }
    c->is_draining = 1;
  }
}

...
  mg_http_listen(&mgr, "http://0.0.0.0:80", f1, NULL);    // HTTP
  mg_http_listen(&mgr, "https://0.0.0.0:443", f2, NULL);  // HTTPS