在下面的例子中:
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
p := new(Proxy)
//host := "www.google.com" // WORKS AS EXPECTED
host := "www.apple.com" // GIVES AN ERROR
u, err := url.Parse(fmt.Sprintf("http://%v/", host))
if err != nil {
log.Printf("Error parsing URL")
}
p.proxy = httputil.NewSingleHostReverseProxy(u)
http.Handle("/", p)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
type Proxy struct {
proxy *httputil.ReverseProxy
}
func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
p.proxy.ServeHTTP(w, r)
}
将 Chrome 指向“localhost:8000”时,将“www.google.com”与“www.apple.com”交换会导致此错误:
无效的网址
请求的 URL“/”无效。参考 #9.a61a32b8.1438231668.41733295
做更多的挖掘,对于 www.apple.com,我得到:
➜ ~ curl --ipv4 -v localhost:8000
< HTTP/1.1 400 Bad Request
< Content-Length: 194
< Content-Type: text/html
< Date: Thu, 30 Jul 2015 05:20:38 GMT
< Expires: Thu, 30 Jul 2015 05:20:38 GMT
< Mime-Version: 1.0
* Server AkamaiGHost is not blacklisted
< Server: AkamaiGHost
<
<HTML><HEAD>
<TITLE>Invalid URL</TITLE>
</HEAD><BODY>
<H1>Invalid URL</H1>
The requested URL "/", is invalid.<p>
Reference #9.65b454b8.1438233638.1f1b8a40
</BODY></HTML>
* Connection #0 to host localhost left intact
对于 www.google.com:
➜ ~ curl --ipv4 -v localhost:8000
< HTTP/1.1 302 Found
< Alternate-Protocol: 80:quic,p=0
< Cache-Control: private
< Content-Length: 219
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 30 Jul 2015 05:03:16 GMT
< Location: http://www.google.com/
* Server sffe is not blacklisted
< Server: sffe
< X-Content-Type-Options: nosniff
< X-Xss-Protection: 1; mode=block
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host localhost left intact
相关分类