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

时间:2014-04-25 08:40:47

标签: php url curl

如何强制curl在HTTP GET请求中包含完整的URL?

卷曲发送(不工作):

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。

3 个答案:

答案 0 :(得分:2)

就我所知,PHP cURL包装器没有公开这样做的方法。

此外,即使您指定了另一个标头,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: */*

你可以做的是build the request manually

$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;

答案 1 :(得分:2)

至少从命令行,如果将curl配置为对请求使用HTTP代理,则curl会发送绝对URI。即使您没有使用代理,也可以指定它使用实际服务器作为代理服务器,然后您的服务器将在请求中接收绝对URI。

答案 2 :(得分:0)

curl始终充当正确的HTTP客户端。请求目标(即GET后面的内容)的standard requires只包含绝对路径和可选的查询。

因此无法使curl将绝对URL作为请求目标发送到源服务器。