Cloudflare 常用配置

同一个域名使用不同的 HTTPS 重定向规则

在 Cloudflare 中,配置的规则 (比如 自动 HTPTPS 重写 功能) 对所有使用了 Cloudflare 加速的域名都生效。

此时假如有 2 个二级域名 d1.abc.comd2.abc.com,都启用了 Cloudflare 加速功能,此时开启 自动 HTPTPS 重写 功能,则使用 HTTP 协议访问,都会被重定向到 HTTPS。假如域名 d2.abc.com 不想进行 HTTPS 重定向,即使用 HTTP 访问 d2.abc.com 不重定向到 https://d2.abc.com。要实现此功能,参考以下步骤

  1. 首先在 SSL/TLS –> 边缘证书开启 自动 HTPTPS 重写 功能,关闭 始终使用 HTTPS 功能

  2. 自动 HTPTPS 重写 中配置规则,参考下图,定义规则名称,选择 自定义筛选表达式,在表达式中配置筛选条件匹配 d2.abc.com,在下面的设置中 关闭 自动 HTPTPS 重写 功能

通过以上配置即可实现,同一个域名的不同子域名有不同的重定向规则。其他类似需求也可参考此思路配置

Python 模块 CloudFlare

pip install CloudFlare

以下示例获取所有的账户名下的域名列表。获取 zones 参数说明

import CloudFlare

# 设置您的 Cloudflare API 密钥
api_key = 'YOUR_API_KEY'
email = 'YOUR_EMAIL'

# 初始化 Cloudflare 客户端
cf = CloudFlare.CloudFlare(email=email, token=api_key)

# 获取所有账户
accounts = cf.accounts.get()

# 遍历每个账户并获取其域名
for account in accounts:
account_id = account['id']
zones = cf.zones.get(params={'account.id': account_id})

for zone in zones:
zone_name = zone['name']
print(f"Account ID: {account_id}, Domain: {zone_name}")

捕获错误消息

使用以下代码处理鉴权错误的代码。如果鉴权错误,可以捕获到错误消息 Unknown X-Auth-Key or X-Auth-Email

>>> try:
... # 尝试获取账户列表
... accounts = cf.accounts.get()
... except Exception as e:
... # 处理异常并输出错误信息
... print(e.args)
...
(9103, 'Unknown X-Auth-Key or X-Auth-Email')

获取域名配置

要从 cf 获取域名配置,可以使用以下常用接口

>>> cf.zones.settings.always_online(zone_id)
{'id': 'always_online', 'value': 'off', 'modified_on': None, 'editable': True}

>>> cf.zones.settings.automatic_https_rewrites(zone_id)
{'id': 'automatic_https_rewrites', 'value': 'on', 'modified_on': None, 'editable': True}

>>> cf.zones.settings.get(zone_id)
[{'id': '0rtt', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'advanced_ddos', 'value': 'on', 'modified_on': None, 'editable': False}, {'id': 'always_online', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'always_use_https', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'automatic_https_rewrites', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'brotli', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'browser_cache_ttl', 'value': 14400, 'modified_on': None, 'editable': True}, {'id': 'browser_check', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'cache_level', 'value': 'aggressive', 'modified_on': None, 'editable': True}, {'id': 'challenge_ttl', 'value': 1800, 'modified_on': None, 'editable': True}, {'id': 'ciphers', 'value': [], 'modified_on': None, 'editable': True}, {'id': 'cname_flattening', 'value': 'flatten_at_root', 'modified_on': None, 'editable': True}, {'id': 'development_mode', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'early_hints', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'edge_cache_ttl', 'value': 7200, 'modified_on': None, 'editable': True}, {'id': 'email_obfuscation', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'filter_logs_to_cloudflare', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'hotlink_protection', 'modified_on': None, 'value': 'off', 'editable': True}, {'id': 'http2', 'value': 'on', 'modified_on': None, 'editable': False}, {'id': 'http3', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'ip_geolocation', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'ipv6', 'value': 'on', 'modified_on': '2023-08-09T08:30:26.562627Z', 'editable': True}, {'id': 'log_to_cloudflare', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'long_lived_grpc', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'max_upload', 'value': 100, 'modified_on': None, 'editable': True}, {'id': 'min_tls_version', 'value': '1.0', 'modified_on': None, 'editable': True}, {'id': 'minify', 'value': {'css': 'off', 'html': 'off', 'js': 'off'}, 'modified_on': None, 'editable': True}, {'id': 'mirage', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'mobile_redirect', 'value': {'status': 'off', 'mobile_subdomain': None, 'strip_uri': False}, 'modified_on': None, 'editable': True}, {'id': 'opportunistic_encryption', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'opportunistic_onion', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'orange_to_orange', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'origin_error_page_pass_thru', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'polish', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'pq_keyex', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'prefetch_preload', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'privacy_pass', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'proxy_read_timeout', 'value': '100', 'modified_on': None, 'editable': False}, {'id': 'pseudo_ipv4', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'response_buffering', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'rocket_loader', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'security_header', 'modified_on': None, 'value': {'strict_transport_security': {'enabled': False, 'max_age': 0, 'include_subdomains': False, 'preload': False, 'nosniff': False}}, 'editable': True}, {'id': 'security_level', 'value': 'medium', 'modified_on': None, 'editable': True}, {'id': 'server_side_exclude', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'sort_query_string_for_cache', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'ssl', 'value': 'full', 'modified_on': None, 'certificate_status': 'none', 'validation_errors': [], 'editable': True}, {'id': 'tls_1_2_only', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'tls_1_3', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'tls_client_auth', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'true_client_ip_header', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'visitor_ip', 'value': 'on', 'modified_on': None, 'editable': True}, {'id': 'waf', 'value': 'off', 'modified_on': None, 'editable': True}, {'id': 'webp', 'value': 'off', 'modified_on': None, 'editable': False}, {'id': 'websockets', 'value': 'on', 'modified_on': None, 'editable': True}]

>>> cf.zones.settings.ssl(zone_id)
{'id': 'ssl', 'value': 'full', 'modified_on': None, 'certificate_status': 'none', 'validation_errors': [], 'editable': True}

更新域名配置

items 列表中包含了需要修改的配置

>>> cf.zones.settings.patch(zone_id, data={'items': [{'id': 'ssl', 'value': 'flexible'}]})
[{'id': 'ssl', 'value': 'flexible', 'modified_on': '2023-08-15T08:58:43.152564Z', 'certificate_status': 'none', 'validation_errors': [], 'editable': True}]

>>> cf.zones.settings.patch(zone_id, data={'items': [{'id': 'ssl', 'value': 'off'}, {'id': 'always_online', 'value': 'on'}]})
[{'id': 'ssl', 'value': 'off', 'modified_on': '2023-08-15T09:03:22.933836Z', 'certificate_status': 'none', 'validation_errors': [], 'editable': True}, {'id': 'always_online', 'value': 'on', 'modified_on': '2023-08-15T09:03:22.967784Z', 'editable': True}]