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

时间:2016-06-22 23:04:13

标签: http go request

我有一个简单的请求来从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发送的所有其他标题,那么它就可以了。

1 个答案:

答案 0 :(得分:-1)

您的测试代码使用相同的HTTP客户端对象来发送两个请求,这些请求可能都是通过相同的连接。

您是否尝试在不同的连接上发送请求?尝试将标志设置为true,然后设置为false,并查看它是否始终只是第二个失败的标志。