在文档中是这样写的:
globbing字母
curl命令行工具支持url的“globbing”。这意味着您可以使用[N-M]和{1,2,3}序列创建范围和列表。用于此([]{})的字母在RFC 3986中保留,因此不能合法地成为此类URL的一部分。
然而,它们在WHATWG规范中并不是保留的或特殊的,所以通配符会弄乱这样的url。在这种情况下可以关闭Globbing(使用——globoff)。
这意味着您应该对保留/特殊字符(:/?#[]@!$&'()*+,;=)进行百分比编码,以避免它们的特殊解释。为此,在ASCII表中放入百分号(%)和十六进制字符值。例如:
Symbol |
Encoded Value |
[ |
%5B |
] |
%5D |
{ |
%7B |
} |
%7D |
curl不期望URL中的保留/特殊字符,这四个符号用于生成多个URL (globbing操作):
$ curl http://localhost:8080/?TEST[a-c]=1
意志相当于
$ curl http://localhost:8080/?TESTa=1
$ curl http://localhost:8080/?TESTb=1
$ curl http://localhost:8080/?TESTc=1
and
$ curl http://localhost:8080/?TEST{a,c,e}=1
意志相当于
$ curl http://localhost:8080/?TESTa=1
$ curl http://localhost:8080/?TESTc=1
$ curl http://localhost:8080/?TESTe=1
如果你想禁用通配符操作:
encode them:
$ curl http://localhost:8080/?TEST%5Ba-c%5D=1
$ curl http://localhost:8080/?TEST%7Ba,c,e%7d=1
For zsh (default shell on Mac OS X) you must escape ? as well. Thus for both bash and zsh shells:
$ curl http://localhost:8080/\?TEST%5Ba-c%5D=1
$ curl http://localhost:8080/\?TEST%7Ba,c,e%7d=1
or use -g/--globoff option:
$ curl -g http://localhost:8080/?TEST[a-c]=1
$ curl -g http://localhost:8080/?TEST{a,c,e}=1 # not enough, see note below
☝ In last example there is a caveat: globbing may be done by bash and zsh shell. To avoid globbing by shell:
either escape characters putting reverse slash (\) (don't forget about escaping ? for zsh shell):
$ curl -g http://localhost:8080/\?TEST\[a-c\]=1
$ curl -g http://localhost:8080/\?TEST\{a,c,e\}=1
or put URL in quotes (single or double):
$ curl -g 'http://localhost:8080/?TEST[a-c]=1'
$ curl -g 'http://localhost:8080/?TEST{a,c,e}=1'
此外,还要注意空方括号([])不会导致curl中的通配符:
$ curl 'http://localhost:8080/?TEST[]=1'
will request /?TEST[]=1。
对于空花括号({})则不是这样:
$ curl 'http://localhost:8080/?TEST{}=1'
curl: (3) empty string within braces in URL position 29:
http://localhost:8080/?TEST{}=1
^
它们必须至少包含一个字符串。
P.S.你可以在docker上测试(按Ctrl+C退出):
$ docker run --rm -p 8080:80 -it nginx
并在单独的终端对其运行curl:
$ curl http://localhost:8080/?TEST[a-c]=1
在日志中,您应该看到为请求生成URL:
172.17.0.1 - - [17/Jan/2023:09:21:53 +0000] "GET /?TESTa=1 HTTP/1.1" 200 615 "-" "curl/7.86.0" "-"
172.17.0.1 - - [17/Jan/2023:09:21:53 +0000] "GET /?TESTb=1 HTTP/1.1" 200 615 "-" "curl/7.86.0" "-"
172.17.0.1 - - [17/Jan/2023:09:21:53 +0000] "GET /?TESTc=1 HTTP/1.1" 200 615 "-" "curl/7.86.0" "-"