diff --git a/docs/c-api/http_server.h/intro.md b/docs/c-api/http_server.h/intro.md
index 6e1c49f4a869bdd83eaf8bb72d7e4697aa58094b..8066523284de3a0d6020124b7b3eb7e95e3dbc1e 100644
--- a/docs/c-api/http_server.h/intro.md
+++ b/docs/c-api/http_server.h/intro.md
@@ -8,6 +8,7 @@ items:
   - { name: mg_get_http_var.md }
   - { name: mg_http_check_digest_auth.md }
   - { name: mg_http_parse_header.md }
+  - { name: mg_http_reverse_proxy.md }
   - { name: mg_http_send_error.md }
   - { name: mg_http_send_redirect.md }
   - { name: mg_http_serve_file.md }
diff --git a/docs/c-api/http_server.h/mg_http_reverse_proxy.md b/docs/c-api/http_server.h/mg_http_reverse_proxy.md
new file mode 100644
index 0000000000000000000000000000000000000000..c0c83835803064897f4ddcb883dac25c2ed7d8ae
--- /dev/null
+++ b/docs/c-api/http_server.h/mg_http_reverse_proxy.md
@@ -0,0 +1,19 @@
+---
+title: "mg_http_reverse_proxy()"
+decl_name: "mg_http_reverse_proxy"
+symbol_kind: "func"
+signature: |
+  void mg_http_reverse_proxy(struct mg_connection *nc,
+                             const struct http_message *hm, struct mg_str mount,
+                             struct mg_str upstream);
+---
+
+Proxies a given request to a given upstream http server. The path prefix
+in `mount` will be stripped of the path requested to the upstream server,
+e.g. if mount is /api and upstream is http://localhost:8001/foo
+then an incoming request to /api/bar will cause a request to
+http://localhost:8001/foo/bar
+
+EXPERIMENTAL API. Please use http_serve_http + url_rewrites if a static
+mapping is good enough. 
+
diff --git a/mongoose.c b/mongoose.c
index d0e45954d9746f951391589c18de1b5dc9ff466f..60ec101478f052c18b9e63d12462667cce42da61 100644
--- a/mongoose.c
+++ b/mongoose.c
@@ -5845,8 +5845,9 @@ static void mg_reverse_proxy_handler(struct mg_connection *nc, int ev,
   }
 }
 
-void mg_handle_reverse_proxy(struct mg_connection *nc, struct http_message *hm,
-                             struct mg_str mount, struct mg_str upstream) {
+void mg_http_reverse_proxy(struct mg_connection *nc,
+                           const struct http_message *hm, struct mg_str mount,
+                           struct mg_str upstream) {
   struct mg_connection *be;
   char burl[256], *purl = burl;
   char *addr = NULL;
@@ -5889,6 +5890,12 @@ void mg_handle_reverse_proxy(struct mg_connection *nc, struct http_message *hm,
       mg_printf(be, "Content-Length: %" SIZE_T_FMT "\r\n", hm->body.len);
       continue;
     }
+    /* We don't support proxying Expect: 100-continue. */
+    if (mg_vcasecmp(&hn, "Expect") == 0 &&
+        mg_vcasecmp(&hv, "100-continue") == 0) {
+      continue;
+    }
+
     mg_printf(be, "%.*s: %.*s\r\n", (int) hn.len, hn.p, (int) hv.len, hv.p);
   }
 
@@ -5909,7 +5916,7 @@ static int mg_http_handle_forwarding(struct mg_connection *nc,
   while ((rewrites = mg_next_comma_list_entry(rewrites, &a, &b)) != NULL) {
     if (mg_strncmp(a, hm->uri, a.len) == 0) {
       if (mg_strncmp(b, p1, p1.len) == 0 || mg_strncmp(b, p2, p2.len) == 0) {
-        mg_handle_reverse_proxy(nc, hm, a, b);
+        mg_http_reverse_proxy(nc, hm, a, b);
         return 1;
       }
     }
diff --git a/mongoose.h b/mongoose.h
index e4cfb9363079cdcec632221838bbdee38ea5a181..336c2eba22e395834e7263ce26c7b4d2be50aa3b 100644
--- a/mongoose.h
+++ b/mongoose.h
@@ -3502,6 +3502,22 @@ void mg_send_head(struct mg_connection *n, int status_code,
  */
 void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...);
 
+#if MG_ENABLE_HTTP_URL_REWRITES
+/*
+ * Proxies a given request to a given upstream http server. The path prefix
+ * in `mount` will be stripped of the path requested to the upstream server,
+ * e.g. if mount is /api and upstream is http://localhost:8001/foo
+ * then an incoming request to /api/bar will cause a request to
+ * http://localhost:8001/foo/bar
+ *
+ * EXPERIMENTAL API. Please use http_serve_http + url_rewrites if a static
+ * mapping is good enough.
+ */
+void mg_http_reverse_proxy(struct mg_connection *nc,
+                           const struct http_message *hm, struct mg_str mount,
+                           struct mg_str upstream);
+#endif
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */