0

Cloudflare自动跳转HTTPS查询参数丢失?5个排查方向和修复方案

2026.05.28 | youres | 8次围观

问题现象

开启Cloudflare的"自动HTTPS重写"或"始终使用HTTPS"后,用户访问 http://example.com/?utm_source=wechat,跳转后UTM参数全部丢失,Google Analytics收不到流量来源。这不是个例,是Cloudflare默认页面规则的已知行为。

Cloudflare为什么会导致参数丢失

1. 页面规则中的转发URL用了硬编码URL

很多教程让你在页面规则里填 https://example.com/$1,但$1只捕获路径,不捕获查询字符串。跳转后 ?utm_source=wechat 直接被丢弃。

2. "始终使用HTTPS"功能的局限

Cloudflare的"总是使用HTTPS"是一个简单的301跳转,它不会保留原始请求的查询参数,尤其当源站本身也有HTTP→HTTPS跳转时,会发生两次跳转,参数在中间某一环丢失。

3. 源站Nginx/Apache也在做跳转

CDN跳转一次,源站又跳转一次。如果源站用的是 return 301 https://$host$request_uri; 但配置有误,参数同样会丢。排查时要分清是哪一层丢的。

4. Cloudflare Workers或Transform Rules介入

如果你用了Cloudflare Workers做跳转逻辑,或者Transform Rules里配置了URL重写,代码里若没有显式保留 request.url 的查询部分,参数会被静默丢弃。

5. 浏览器缓存了错误的301

一旦浏览器缓存了不带参数的301响应,后续所有请求都会跳过参数直接跳。用隐身窗口或curl验证才能看清真实行为。

5个修复方案

方案一:页面规则正确捕获查询参数

在Cloudflare页面规则转发URL时,目标URL填写:

https://example.com/$1$2is_args$args

注意:Cloudflare页面规则的 $1 是路径,? 后面的查询字符串需要单独处理。更可靠的做法是改用Transform Rules(见方案二)。

方案二:用Transform Rules保留查询字符串(最稳妥)

Cloudflare的Transform Rules(转换规则)→ 重写URL

  1. 进入Cloudflare控制台 → Rules → Transform Rules
  2. 创建规则:当 starts_with(http.request.uri, "http://")
  3. 重写URL为 https:// + http.request.host + http.request.uri.path + "?" + raw.http.request.query.string

这样查询字符串会被完整保留,不会依赖正则表达式捕获。

方案三:关闭Cloudflare HTTPS跳转,改由源站处理

如果Cloudflare层面跳转不可控,可以直接关闭"始终使用HTTPS",改在源站Nginx配置:

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

$request_uri 包含路径+查询参数,不会丢。

方案四:用curl验证跳转链,定位丢失层级

用curl查看跳转链:

curl -I -L --max-redirs 5 "http://example.com/?utm_source=test"

如果看到两次301(一次Cloudflare、一次源站),说明配置重叠,需要去掉一层。

方案五:用Workers脚本精准控制跳转

用Cloudflare Workers做跳转,代码里显式保留search参数:

addEventListener("fetch", event => {
  let url = new URL(event.request.url)
  if (url.protocol === "http:") {
    url.protocol = "https:"
    return Response.redirect(url.toString(), 301)
  }
  event.respondWith(fetch(event.request))
})

url.toString() 会自动带上查询参数,比页面规则可靠得多。

快速排查清单

  • 用隐身窗口 + curl验证,排除浏览器缓存干扰
  • 检查Cloudflare页面规则转发URL是否包含查询字符串占位符
  • 检查Transform Rules是否重写了URL且未保留查询参数
  • 检查源站是否有独立的HTTP→HTTPS跳转配置
  • curl -I -L 查看完整跳转链,确认参数在哪一层丢失

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章