I do not know why this reverse proxy does not work. I have seen several examples, and I cannot find anything wrong with that.
package main import ( "log" "net/url" "net/http" "net/http/httputil" ) func report(r *http.Request){ log.Print("URL: " + r.URL.Path) log.Print("Scheme: " + r.URL.Scheme) log.Print("Host: " + r.URL.Host) //r.URL.Scheme = "http" //r.URL.Host = "stackoverflow.com" //r.Header.Set("Host", "stackoverflow.com") //log.Print("Header Host: " + r.Header.Get("Host")) } func main() { proxy := httputil.NewSingleHostReverseProxy( &url.URL{Scheme:"http",Host:"myrealserver.com"}) proxy.Director = report // http.Handle("/", proxy) error := http.ListenAndServe("mylocalhost.com:8080", proxy) if(error != nil) { log.Fatal(error) } }
He writes:
2014/04/18 21:32:50 URL: /arg/es 2014/04/18 21:32:50 Scheme: 2014/04/18 21:32:50 Host: 2014/04/18 21:32:50 http: proxy error: unsupported protocol scheme "" 2014/04/18 21:32:51 URL: /favicon.ico 2014/04/18 21:32:51 Scheme: 2014/04/18 21:32:51 Host: 2014/04/18 21:32:51 http: proxy error: unsupported protocol scheme ""
If I uncomment the line that overrides the schema, the error message becomes:
2014/04/18 21:38:05 http: proxy error: http: no Host in request URL
If I uncomment the line that redefines the host, then the target server will become stackoverflow.com (I mean, it never uses "myrealserver.com").
If I ask mylocalhost.com:8080/somepath (or even /), then I get 404 from Stackoverflow, regardless of whether stackoverflow.com/somepath exists or not. It says:
Couldn't find mylocalhost.com:8080 The Q&A site mylocalhost.com:8080 doesn't seem to exist... yet
It does not translate the host header automatically.
If then I uncomment the line that sets (and the other that prints) the host header. Then I can read "stackoverflow.com" in the journal, but I still get the same 404-page reporting that I am trying to access "mylocalhost.com".
I am using go1.2.1 linux/amd64
How should I make the program work as a proxy?
go proxy
Sebastián grignoli
source share