当前位置: 首页 > 知识库问答 >
问题:

python - 为什么 alicdn 的图片无法被 aliyun 服务器访问?

丌官瀚
2024-08-08

目标图片:https://img.alicdn.com/imgextra/O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg

发现这个图片可以直接在浏览器打开,在我的 mac 上也可以使用 wget 直接下载

图片.png

╰─➤  wget https://img.alicdn.com/imgextra/O1CN01MW6Bpi1KJXbwTYrw5_\!\!2216508591143.jpg
--2024-08-08 10:23:38--  https://img.alicdn.com/imgextra/O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg
Resolving img.alicdn.com (img.alicdn.com)... 39.183.55.234, 39.183.55.233
Connecting to img.alicdn.com (img.alicdn.com)|39.183.55.234|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 64164 (63K) [image/webp]
Saving to: ‘O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg’

O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143 100%[===============================================================================>]  62.66K  --.-KB/s    in 0.01s   

2024-08-08 10:23:38 (4.83 MB/s) - ‘O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg’ saved [64164/64164]

但是因为我的服务是部署在 aliyun 的 ack,但是我发现在 aliyun ack 访问这个图片居然就是 420 !

写了下面的测试代码

import os
import requests
from PIL import Image


def download_image(url, save_path):
    response = requests.get(url)
    if response.status_code == 200:
        with open(save_path, 'wb') as f:
            f.write(response.content)
        if os.path.getsize(save_path) > 0:  # 检查文件是否为空
            try:
                image = Image.open(save_path)
                width, height = image.size
                file_size = len(response.content)
                print(f"图片分辨率为:{width}x{height}")
                print(f"图片体积大小为:{file_size} 字节")
            except Exception as e:
                print(f"打开图片时出错: {e}")
        else:
            print("文件为空或未下载正确")
    else:
        print(f"请求失败,状态码: {response.status_code}")


url = 'https://img.alicdn.com/imgextra/O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg'
save_path = 'image.jpg'  # 你可以修改保存的文件名和路径

download_image(url, save_path)

上面的代码,在我的 mac 上的执行效果

图片分辨率为:800x800
图片体积大小为:64164 字节

在 aliyun ack 内的 pod 的执行效果

请求失败,状态码: 420

大无语了!

共有2个答案

葛景龙
2024-08-08

被反爬了吧,其实很正常。

小牛22976
2024-08-08

解答

在您的案例中,问题出现在阿里云(Aliyun)ACK(Alibaba Cloud Container Service for Kubernetes)集群内部访问阿里云CDN(内容分发网络)域名 img.alicdn.com 时遇到了HTTP状态码420。HTTP 420状态码并不是一个标准的HTTP状态码,通常是由特定服务器或CDN服务自定义的。在阿里云CDN的上下文中,420状态码可能表示某些类型的访问控制或安全策略阻止了请求。

可能的原因和解决方案:

  1. IP地址白名单或黑名单

    • 检查您的阿里云CDN或源站服务器是否配置了IP地址白名单或黑名单。由于ACK集群的Pod IP地址可能会频繁变化,它们可能没有被包括在允许的IP地址列表中。
    • 如果可能,尝试将阿里云ACK集群的VPC(虚拟私有云)网段添加到CDN的白名单中。
  2. Referer检查

    • CDN或源站服务器可能配置了Referer检查,以防止未授权的第三方网站访问图片。由于您的请求来自Kubernetes Pod,Referer头部可能与直接浏览器访问时不同,导致请求被拒绝。
    • 您可以尝试修改HTTP请求头,包括正确的Referer值,或者如果服务器配置允许,禁用Referer检查。
  3. 用户代理(User-Agent)检查

    • 类似于Referer检查,服务器也可能根据User-Agent头部来阻止某些类型的访问。您可以尝试修改User-Agent头部以匹配浏览器请求。
  4. 安全组或网络ACLs

    • 检查阿里云VPC的安全组设置,确保出站规则允许访问 img.alicdn.com 的443端口(HTTPS)。
    • 同样,检查阿里云CDN或源站服务器的安全设置,确保没有阻止来自您ACK集群的流量。
  5. CDN缓存问题

    • 虽然不太可能是420状态码的原因,但清除CDN缓存可能有助于解决问题。
  6. 联系阿里云支持

    • 如果上述步骤都无法解决问题,建议联系阿里云的技术支持团队,他们可以提供更具体的帮助和解决方案。
  7. 调试和日志

    • 在阿里云ACK集群的Pod中启用更详细的日志记录,以便捕获更多关于请求失败的信息。
    • 检查CDN和源站服务器的访问日志,以了解请求被拒绝的具体原因。

通过上述步骤,您应该能够诊断并解决从阿里云ACK集群访问 img.alicdn.com 时遇到的420状态码问题。

 类似资料:
  • 我没有设置密码。我该如何解决这件事?

  • 我已经启动了我的centos6.5服务器上的Jupyter笔记本服务器。Jupyter跑起来就像 当我想在同一局域网中远程访问Jupyter时,请说open,我根本无法打开Jupyter页面。顺便说一下,我可以成功访问远程centos服务器。 可能的原因是什么?

  • 以下是启动本地计算机kubernetes集群的指南:http://kubernetes.io/v1.0/docs/gett-started-guides/docker.html 我用。yaml文件创建了各种POD,一切正常,我可以使用容器IPs访问nginx和mysql(172.17.x.x范围内,使用docker0),但是当我创建服务时,服务IPs在10.0.0.x范围内,其他容器无法访问。 k

  • 当我在tomcat服务器上运行它时,它在服务页面中返回以下错误:我不能访问WSDL和SOAP 我有这个错误: 类型异常报告 servlet[CXFServlet]的“servlet.init()”消息引发了异常 说明服务器遇到内部错误,导致它无法满足请求。

  • 我已经安装了Jenkins和Sonarqube5.1.1(也尝试了LTS),它运行在Ubuntu服务器上,可以从外部访问。我已经安装了Jenkins SonarQube插件,一切都差不多工作了。如果我在Jenkins中将SonarQube服务器URL设置为localhost,那么一切都很好。但是到SonarQube(在Jenkins内部)的链接将指向localhost,当我从外部访问Jenkins

  • 我无法通过集装箱中的港口连接到django。我使用的地址是:0.0.0.0.:8000,请参阅:http://joxi.ru/Dr8MeGLhkBWnLm.我正在用一个命令创建一个图像和一个容器:“docker compose up-d”。 docker-compose.yaml Dockerfile 如何解决此问题?