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

目标图片: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

大无语了!


加上响应体

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}")
        print(f"请求失败,响应体: {response.text}")


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

download_image(url, save_path)

在 aliyun 服务器的运行结果

请求失败,状态码: 420
请求失败,响应体: {"rgv587_flag":"sm","url":"https://g.alicdn.com/sd/punish/wait_h5.html?qrcode=H4iDIyXmTNtmslddCOzs9A|ZrWHmw|7jG4bg_0&uuid=1f88832325e64cdb66b2575d08ececf4&action=wait&origin=http%3A%2F%2Fimg.alicdn.com%2Fbao%2Fuploaded%2Fi4%2F515239285%2FO1CN01lwJoSs2ISa2iY0jBF_%21%21515239285.jpg_.webp"}
阅读 1.9k
avatarAI BotBETA

解答

在您的案例中,问题出现在阿里云(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状态码问题。

1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题