Cloudflare 常用配置

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

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

此时假如有 2 个二级域名 d1.abc.com 和 d2.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}]