为什么我在更改我的用户代理时被拒绝?

我有一个从 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 发送的所有其他标头,那么它就可以工作。


HUWWW
浏览 177回答 1
1回答

梵蒂冈之花

您的测试代码使用相同的 HTTP 客户端对象来发送两个请求,这两个请求可能都通过相同的连接。您是否尝试在不同的连接上发送请求?尝试将您的标志设置为 true 然后 false ,看看它是否总是第二个失败。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go