使用curl通过代理请求时,如何仅发送资源路径而非绝对URI?
解决curl通过代理发送仅含资源路径的HTTP请求
当使用curl通过代理执行HTTP请求时,默认会发送包含完整绝对URI的请求,示例如下:
$ curl -v --proxy localhost:8080 localhost:8888/ > GET http://localhost:8888/ HTTP/1.1 > [...]
若需要让请求仅发送资源路径(即GET / HTTP/1.1格式),可以通过以下两种curl选项组合实现:
方法一:使用--request-target指定请求路径
通过--request-target直接定义请求行的目标部分,同时配合占位URL和手动设置Host头:
curl -v --proxy localhost:8080 --request-target "/" -H "Host: localhost:8888" http://dummy/
这里的http://dummy/是占位用的无效URL,curl仅需要一个URL参数即可执行,实际请求目标由--request-target指定,Host头用于告知代理目标服务的主机和端口。
方法二:使用--connect-to指定代理连接目标
通过--connect-to命令代理连接到目标主机,同时使用空主机的URL:
curl -v --proxy localhost:8080 --connect-to ::localhost:8888 http:///
--connect-to ::localhost:8888表示让代理连接到localhost:8888,而http:///作为URL会让curl生成仅含路径的请求行,并且自动添加正确的Host头(localhost:8888)。
以上两种方法都会让curl发送符合期望的GET / HTTP/1.1请求行,适配代理的解析特性。
内容的提问来源于stack exchange,提问作者Pamplemousse
相关产品推荐
相关产品推荐

