gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:48:34 25 4
gpt4 key购买 nike

我有一个从 nike.com 获取 robots.txt 文件的简单请求。 Go 中的普通 GET 请求会按预期返回文件。在我当前的浏览器 (Chrome) 中,我可以正常访问该文件。但是,当我尝试将 Go 中的 UA 更改为与浏览器相同的 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>
})
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 发送的所有其他 header ,那么它就可以工作。

最佳答案

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

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

关于http - 为什么我更改用户代理时被拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37979630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com