我有一个从 nike.com 获取 robots.txt 文件的简单请求。Go 中的普通 GET 请求会按预期返回文件。在我当前的浏览器(Chrome)中,我可以正常访问该文件。但是,当我尝试将 Go 中的 UA 更改为与浏览器相同时,我收到 403 错误。换句话说,我可以使用 Go 中的默认设置访问该页面,证明我的代码是正确的,但是一旦我更改了 UA,我就会得到 403(即使我的浏览器中的相同 UA 可以工作)。如果我将 UA 更改为随机值(例如“不是我”),那么我会得到 200。为什么我不能使用浏览器的 UA?package mainimport ( "log" "net/http" "github.com/davecgh/go-spew/spew")func main() { var resp *http.Response var err error u := "http://www.nike.com/robots.txt" for _, ua := range []bool{false, true} { client := &http.Client{} req, _ := http.NewRequest("GET", u, nil) if ua == true { req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36") } resp, err = client.Do(req) if err != nil { log.Fatalln(err) } log.Println("StatusCode", resp.StatusCode) spew.Dump(resp.Request) log.Println("----------------------------") }}响应:2016/06/22 16:56:57 StatusCode 200(*http.Request)(0xc8200d02a0)({ Method: (string) (len=3) "GET", URL: (*url.URL)(0xc820076280)(http://www.nike.com/robots.txt), Proto: (string) (len=8) "HTTP/1.1", ProtoMajor: (int) 1, ProtoMinor: (int) 1, Header: (http.Header) { }, Body: (io.ReadCloser) <nil>, ContentLength: (int64) 0, TransferEncoding: ([]string) <nil>, Close: (bool) false, Host: (string) (len=12) "www.nike.com", Form: (url.Values) <nil>, PostForm: (url.Values) <nil>, MultipartForm: (*multipart.Form)(<nil>), Trailer: (http.Header) <nil>, RemoteAddr: (string) "", RequestURI: (string) "", TLS: (*tls.ConnectionState)(<nil>), Cancel: (<-chan struct {}) <nil>})编辑:我一直在玩,如果我设置了 Chrome 发送的所有其他标头,那么它就可以工作。
1 回答

梵蒂冈之花
TA贡献1900条经验 获得超5个赞
您的测试代码使用相同的 HTTP 客户端对象来发送两个请求,这两个请求可能都通过相同的连接。
您是否尝试在不同的连接上发送请求?尝试将您的标志设置为 true 然后 false ,看看它是否总是第二个失败。
- 1 回答
- 0 关注
- 176 浏览
添加回答
举报
0/150
提交
取消