Goreplay动态变量请求重写失效问题求助
Gor 1.3.3 正则分组$1未捕获动态变量的解决方案
问题原因分析
你的问题大概率由两个核心因素导致:
- Shell参数解析干扰:在bash等shell环境中,双引号包裹的
$1会被解析为shell的位置参数(无传入参数时为空),导致Gor实际收到的重写规则里$1被替换成空字符串。 - 正则转义丢失:双引号中的
\d会被shell解析为普通字符d,使得正则表达式变成(d+),根本无法匹配数字,自然捕获不到分组内容。
解决方案
1. 使用单引号包裹正则相关参数(推荐)
单引号会阻止shell解析任何特殊字符,确保正则表达式和分组引用完整传递给Gor:
./gor --input-raw :3000 \ --output-http='http://athena-service.uranus.svc.cluster.local' \ --http-rewrite-url '/onemg-internal/end_user/v1/drug_skus/(\d+)/dynamic:/pharma-pdp/v1/drug/dynamic/$1' \ --http-allow-url '/onemg-internal/end_user/v1/drug_skus/(\d+)/dynamic'
2. 双引号下的转义处理
如果必须使用双引号,需要对\d和$1分别转义:
./gor --input-raw :3000 \ --output-http="http://athena-service.uranus.svc.cluster.local" \ --http-rewrite-url "/onemg-internal/end_user/v1/drug_skus/(\\d+)/dynamic:/pharma-pdp/v1/drug/dynamic/\$1" \ --http-allow-url "/onemg-internal/end_user/v1/drug_skus/(\\d+)/dynamic"
\\d确保shell将\d完整传递给Gor,用于匹配数字\$1避免shell把$1解析为环境变量
3. 验证正则匹配有效性
可以通过Go语言的简单代码测试正则是否能正确捕获分组:
package main import ( "fmt" "regexp" ) func main() { re := regexp.MustCompile(`/onemg-internal/end_user/v1/drug_skus/(\d+)/dynamic`) match := re.FindStringSubmatch("/onemg-internal/end_user/v1/drug_skus/1234/dynamic") if len(match) > 1 { fmt.Println("捕获到的分组:", match[1]) // 应输出1234 } }
4. 升级Gor版本
Gor 1.3.3是2017年的老旧版本,后续版本修复了大量正则重写相关的bug,升级到最新稳定版可以避免很多兼容性问题。
内容的提问来源于stack exchange,提问作者DeepS
相关产品推荐
相关产品推荐

