我有一个简单的请求来从nike.com获取robots.txt文件。 Go中的普通GET请求按预期返回文件。在我当前的浏览器(Chrome)中,我可以正常访问该文件。但是,当我尝试将Go中的UA更改为与浏览器相同时,我收到403错误。
换句话说,我可以使用Go中的默认设置访问该页面,证明我的代码是正确的,但是一旦我更改UA,我得到403(即使我浏览器中的UA相同)。
如果我将UA更改为随机的(例如“Not me”),那么我得到200.为什么我不能使用浏览器的UA?
package main
import (
"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>
})
2016/06/22 16:56:57 ----------------------------
2016/06/22 16:56:57 StatusCode 403
(*http.Request)(0xc820110000)({
Method: (string) (len=3) "GET",
URL: (*url.URL)(0xc8200ea180)(http://www.nike.com/robots.txt),
Proto: (string) (len=8) "HTTP/1.1",
ProtoMajor: (int) 1,
ProtoMinor: (int) 1,
Header: (http.Header) (len=1) {
(string) (len=10) "User-Agent": ([]string) (len=1 cap=1) {
(string) (len=104) "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"
}
},
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>
})
2016/06/22 16:56:57 ----------------------------
编辑: 我一直在玩,如果我设置Chrome发送的所有其他标题,那么它就可以了。
答案 0 :(得分:-1)
您的测试代码使用相同的HTTP客户端对象来发送两个请求,这些请求可能都是通过相同的连接。
您是否尝试在不同的连接上发送请求?尝试将标志设置为true,然后设置为false,并查看它是否始终只是第二个失败的标志。