0

curl -L -w url_effective批量检测UTM参数脚本

2026.06.06 | youres | 23次围观

为什么要用curl批量检测UTM参数

做营销投放的同学都知道,UTM参数是追踪流量来源的生命线。短链跳转、CDN层重定向、Nginx/Cloudflare配置不当,都可能导致UTM参数在重定向过程中被静默丢弃。等发现GA4报表里流量归因变成(direct)的时候,预算已经浪费了一大截。

手动一个一个用curl -L -v去测?几百条短链人手点得点到明年。我们需要一个批量检测脚本,自动逐条验证UTM参数在重定向后是否完整保留,并输出结构化结果。

curl -L 与 url_effective 的核心作用

curl -L让请求跟随重定向,但光有-L只能看到最终响应内容,无法精确获取最终跳转后的URLurl_effective是curl的write-out变量,专门用来输出"实际生效的最终URL"——也就是重定向链路的最后一跳地址。

核心思路:

  • -L:跟随重定向(处理301/302/307/308)
  • -w "%{url_effective}":请求完成后输出最终URL
  • 将最终URL与原始URL对比,判断UTM参数是否保留

基础版:单条URL检测命令

# 查看单条URL重定向后的最终地址(含UTM参数)
curl -L -s -o /dev/null -w "最终URL: %{url_effective}\n" "https://short.url/abc?utm_source=wechat&utm_medium=social"

参数说明:

  • -s:静默模式,不显示进度条
  • -o /dev/null:丢弃响应体,只看头部和重定向
  • -w:请求完成后执行格式化输出

进阶版:批量检测脚本(Shell版)

以下脚本从urls.txt逐行读取URL,自动检测UTM参数是否保留,并输出CSV格式报告:

#!/bin/bash
# urls.txt 每行一个待检测URL,格式:https://短链/xxx?utm_source=xxx

while IFS= read -r url; do
  final_url=$(curl -L -s -o /dev/null -w "%{url_effective}" "$url")
  if [[ "$final_url" == *"utm_"* ]]; then
    echo "$url,PASS,$final_url"
  else
    echo "$url,FAIL,$final_url"
  fi
done < urls.txt > result.csv

增强版:输出JSON格式(配合jq解析)

如果你需要将检测结果接入监控系统或导入数据库,JSON格式更合适:

#!/bin/bash

echo "[" > result.json
first=true

while IFS= read -r url; do
  final_url=$(curl -L -s -o /dev/null -w "%{url_effective}" "$url")
  status_code=$(curl -L -s -o /dev/null -w "%{http_code}" "$url")
  
  if [ "$first" = true ]; then
    first=false
  else
    echo "," >> result.json
  fi
  
  cat >> result.json << EOF
  {"url":"$url","final_url":"$final_url","status":"$status_code"}
EOF

done < urls.txt

echo "]" >> result.json

PowerShell版本(Windows环境)

Windows用户没有bash,但可以用PowerShell实现同样功能:

$urls = Get-Content urls.txt

foreach ($url in $urls) {
  $resp = Invoke-WebRequest -Uri $url -MaximumRedirection 5 -SkipCertificateCheck
  $finalUrl = $resp.BaseResponse.RequestMessage.RequestUri.ToString()
  
  if ($finalUrl -match "utm_") {
    "$url,PASS,$finalUrl" >> result.csv
  } else {
    "$url,FAIL,$finalUrl" >> result.csv
  }
}

常见导致UTM丢失的原因

  • Nginx return 301 没加 $is_args$args:导致查询字符串被截断
  • Cloudflare"始终使用HTTPS":默认不保留查询字符串,需要配置Transform Rules
  • 短链服务配置错误:部分短链平台跳转时主动丢弃UTM参数
  • 后端框架redirect方法:某些框架默认不保留原始查询参数

相关文章

版权声明

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

发表评论