如何强制cURL发送一个完整的URL作为请求目标?

guz6ccqo  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(135)

如何强制curl在HTTP GET请求中包含完整的URL?
curl 发送(不工作):

GET /some/path HTTP/1.1
Host: my-domain-here.com
...

我希望它是(工作):

GET http://my-domain-here.com/some/path HTTP/1.1
Host: i2.wp.com

所以我希望主机总是包含在GET行中。我如何使用CURL/PHP来实现这一点呢?服务器只能处理绝对URL。

jfewjypa

jfewjypa1#

据我所知,PHP cURL Package 器并没有公开这样做的方法。
此外,cURL会自动变更Host信头,即使您指定了不同的信头。例如:

curl -v --dump-header - -0 -H 'Host: my-domain.com' http://subdomain.my-domain.com/something.html

将忽略自定义标头并发送以下内容:

GET /something.html HTTP/1.0
User-Agent: curl/7.35.0
Host: subdomain.my-domain.com
Accept: */*

您可以手动构建请求:

$host = 'my-domain.com';
$path = 'http://subdomain.my-domain.com/something.html';

$fp = fsockopen($host, 80);

fputs($fp, "GET $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: 0\r\n");
fputs($fp, "Connection: close\r\n\r\n");

$result = ''; 
while(!feof($fp)) {
    $result .= fgets($fp, 128);
}

fclose($fp);

echo $result;
s4chpxco

s4chpxco2#

至少在命令行中,如果配置curl使用HTTP代理来处理请求,curl确实会发送绝对URI。即使没有使用代理,也可以指定它使用实际的服务器作为代理服务器,这样服务器就会收到请求中的绝对URI。

vc6uscn9

vc6uscn93#

curl始终充当正确的HTTP客户端。该标准要求请求目标(即GET之后的内容)仅由绝对路径和可选的查询组成。
因此,不可能使curl将作为请求目标的绝对URL发送到源服务器。

13z8s7eq

13z8s7eq4#

curl--request-target选项

以下命令将

  • 连接到127.0.0.1
  • GET http://request.host.name/path/ HTTP/1.1形式发送请求路径
  • Host标头设置为Host: host.header

第一个

相关问题