aboutsummaryrefslogtreecommitdiffstats
path: root/doc-src/features/reverseproxy.html
blob: af5a5c53218bbefda573d0892979d192f18c643d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
In reverse proxy mode, mitmproxy accepts standard HTTP requests and forwards
them to the specified upstream server. This is in contrast to
<a href="@!urlTo("upstreamproxy.html")!@">upstream proxy mode</a>, in which
mitmproxy forwards HTTP proxy requests to an upstream proxy server.

<table class="table">
    <tbody>
        <tr>
            <th width="20%">command-line</th> <td>-R <i>scheme</i>://hostname[:port]</td>
        </tr>
    </tbody>
</table>

Here, **scheme** signifies if the proxy should use TLS to connect to the server.
mitmproxy accepts both encrypted and unencrypted requests and transforms them to what the server
expects.

    mitmdump -R https://httpbin.org -p 80
    mitmdump -R https://httpbin.org -p 443


### 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:

    $ python 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 <samp>example.com</samp>, an error is returned.<br>
There are two ways to solve this:
<ol>
    <li>Modify the hosts file of your OS so that example.com resolves to 127.0.0.1.</li>
    <li>
        Instruct mitmproxy to rewrite the host header by passing <kbd>&#8209;&#8209;setheader&nbsp;:~q:Host:example.com</kbd>.
        However, keep in mind that absolute URLs within the returned document or HTTP redirects will cause the client application
        to bypass the proxy.
    </li>
</ol>