我有一个从 nike.com 获取 robots.txt 文件的简单请求。Go 中的普通 GET 请求会按预期返回文件。在我当前的浏览器(Chrome)中,我可以正常访问该文件。但是,当我尝试将 Go 中的 UA 更改为与浏览器相同时,我收到 403 错误。
换句话说,我可以使用 Go 中的默认设置访问该页面,证明我的代码是正确的,但是一旦我更改了 UA,我就会得到 403(即使我的浏览器中的相同 UA 可以工作)。
如果我将 UA 更改为随机值(例如“不是我”),那么我会得到 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>
})
编辑:我一直在玩,如果我设置了 Chrome 发送的所有其他标头,那么它就可以工作。
梵蒂冈之花
相关分类