aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/features/reverseproxy.rst33
-rw-r--r--mitmproxy/protocol/http.py4
2 files changed, 13 insertions, 24 deletions
diff --git a/docs/features/reverseproxy.rst b/docs/features/reverseproxy.rst
index 86a5b2e4..85ad33e8 100644
--- a/docs/features/reverseproxy.rst
+++ b/docs/features/reverseproxy.rst
@@ -29,29 +29,14 @@ them to what the server expects.
Host Header
-----------
-In reverse proxy mode, mitmproxy does not rewrite the host header. While often useful, this
-may lead to issues with public web servers. For example, consider the following scenario:
+In reverse proxy mode, mitmproxy automatically rewrites the Host header to match the
+upstream server. This allows mitmproxy to easily connect to existing endpoints on the
+open web (e.g. ``mitmproxy -R https://example.com``).
-.. code-block:: none
- :emphasize-lines: 5
-
- >>> mitmdump -d -R http://example.com/
- >>> curl http://localhost:8080/
-
- >> GET https://example.com/
- Host: localhost:8080
- User-Agent: curl/7.35.0
- [...]
-
- << 404 Not Found 345B
-
-Since the Host header doesn't match "example.com", an error is returned.
-There are two ways to solve this:
+However, keep in mind that absolute URLs within the returned document or HTTP redirects will
+NOT be rewritten by mitmproxy. This means that if you click on a link for "http://example.com"
+in the returned web page, you will be taken directly to that URL, bypassing mitmproxy.
-1. Modify the hosts file of your OS so that "example.com" resolves to your proxy's IP.
- Then, access example.com directly. Make sure that your proxy can still resolve the original IP
- or specify an IP in mitmproxy.
-2. Use mitmproxy's :ref:`setheaders` feature to rewrite the host header:
- ``--setheader :~q:Host:example.com``.
- However, keep in mind that absolute URLs within the returned document or HTTP redirects will
- cause the client application to bypass the proxy.
+One possible way to address this is to modify the hosts file of your OS so that "example.com"
+resolves to your proxy's IP, and then access the proxy by going directly to example.com.
+Make sure that your proxy can still resolve the original IP, or specify an IP in mitmproxy. \ No newline at end of file
diff --git a/mitmproxy/protocol/http.py b/mitmproxy/protocol/http.py
index 894ae465..e1487943 100644
--- a/mitmproxy/protocol/http.py
+++ b/mitmproxy/protocol/http.py
@@ -184,6 +184,10 @@ class HttpLayer(base.Layer):
self.channel.ask("error", flow)
return
+ # update host header in reverse proxy mode
+ if self.mode == "reverse":
+ flow.request.headers["Host"] = self.config.upstream_server.address.host
+
# set upstream auth
if self.mode == "upstream" and self.config.upstream_auth is not None:
flow.request.headers["Proxy-Authorization"] = self.config.upstream_auth