HTTP 重定向给出与位置 header 相同的 url(原始)
HTTP Redirect giving the same url (original) as Location header
我正在尝试使用套接字从网站获取数据,我得到了重定向,但重定向与之前的相同 url
下面的代码完美运行
import requests
r = requests.get('https://links.papareact.com/f90',
allow_redirects=False)
print(r.status_code)
print(r.headers["location"])
这是输出 Location
header 是新的 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
请解释为什么会发生这种情况以及获得预期结果的可能解决方案? :(
Here is the socket code which behaves weird
这里没有什么奇怪的。重定向是根据位置 header 到 https://
(加密,端口 443),而您的原始请求是针对 http://
(未加密,端口 80)。
这是一种非常常见的网站行为,它们将纯 HTTP 请求重定向到与 HTTPS 相同的路径。如果您随后访问这个新的 (HTTPS) 位置,您可能会得到与您使用 requests.get('https://...
时相同的重定向,即到 http://pngimg.com/uploads/amazon/amazon_PNG11.png
.
我正在尝试使用套接字从网站获取数据,我得到了重定向,但重定向与之前的相同 url
下面的代码完美运行
import requests
r = requests.get('https://links.papareact.com/f90',
allow_redirects=False)
print(r.status_code)
print(r.headers["location"])
这是输出 Location
header 是新的 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
请解释为什么会发生这种情况以及获得预期结果的可能解决方案? :(
Here is the socket code which behaves weird
这里没有什么奇怪的。重定向是根据位置 header 到 https://
(加密,端口 443),而您的原始请求是针对 http://
(未加密,端口 80)。
这是一种非常常见的网站行为,它们将纯 HTTP 请求重定向到与 HTTPS 相同的路径。如果您随后访问这个新的 (HTTPS) 位置,您可能会得到与您使用 requests.get('https://...
时相同的重定向,即到 http://pngimg.com/uploads/amazon/amazon_PNG11.png
.