HTTP Redirect 提供与 Location 标头相同的 url(原始)

Posted

技术标签:

【中文标题】HTTP Redirect 提供与 Location 标头相同的 url(原始)【英文标题】:HTTP Redirect giving the same url (original) as Location header 【发布时间】:2021-10-19 05:03:06 【问题描述】:

我正在尝试使用套接字从网站获取数据,我得到了重定向,但重定向与之前的 url 相同

以下代码完美运行

import requests
    
r = requests.get('https://links.papareact.com/f90',
                 allow_redirects=False)
    
print(r.status_code)
print(r.headers["location"])

这里是输出Location header is new url

301
http://pngimg.com/uploads/amazon/amazon_PNG11.png

这是行为怪异的套接字代码

import socket

HOST = "links.papareact.com"
PORT = 80
path = "f90"

headers = f"GET /path HTTP/1.1\r\n" + \
    f"Host: HOST\r\n\r\n"

connection = (HOST, PORT)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(connection)

s.send(headers.encode())

while True:
    data = s.recv(4096).decode().strip()
    if data.endswith("\r\n\r\n") or not data:
        break
    print(data)

输出

HTTP/1.1 301 Moved Permanently
Date: Tue, 17 Aug 2021 09:15:33 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Tue, 17 Aug 2021 10:15:33 GMT
Location: https://links.papareact.com/f90
Report-To: "endpoints":["url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=0ptwEG6zbfCPDGYczBruC%2FNuMmmsfwqSd6emUpu2aRIa9JtNvIpV3rcWZjfdMrP7EV9EM94UxTx4XbEk4P6KBk4PIb%2BLxPrwitq1Fo10u%2FtGnJnCFqFFh8XGutpJsIy13zCaUYGf"],"group":"cf-nel","max_age":604800
NEL: "success_fraction":0,"report_to":"cf-nel","max_age":604800
Server: cloudflare
CF-RAY: 6801cc6c5d301d14-BLR
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443"; ma=86400

这里的Location Header 和之前的 url 一样

请解释为什么会发生这种情况以及获得预期结果的可能解决方案? :(

【问题讨论】:

【参考方案1】:

这是行为怪异的套接字代码

这里没有什么奇怪的。重定向是根据位置标头到 https://(加密,端口 443),而您的原始请求是针对 http://(未加密,端口 80)。

这是一种非常常见的网站行为,它们将纯 HTTP 请求重定向到与 HTTPS 相同的路径。如果您随后访问这个新 (HTTPS) 位置,您可能会获得与使用 requests.get('https://... 相同的重定向,即到 http://pngimg.com/uploads/amazon/amazon_PNG11.png

【讨论】:

仅供参考,服务器可能重定向到相同/相似 URL 的另一个常见原因是添加原始 URL 想要但在请求中不存在的 cookie。在这个例子中不是这样,但我看到它有时会发生。

以上是关于HTTP Redirect 提供与 Location 标头相同的 url(原始)的主要内容,如果未能解决你的问题,请参考以下文章

forward 与 redirect 区别

出现错误:redirect_uri_mismatch 请求中的重定向 URI:http://localhost:8080/oauth2callback 与注册的重定向 URI 不匹配

nodejs 重定向 (redirect + writeHead(Location))

微信登录报错:redirect_uri域名与后台配置不一致,错误码10003

HTTP返回码中301与302的区别

微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003