今天我正在尝试对正在侦听端口8080的某个网站进行卷曲调用。但是,这样的调用会被发送到端口80而不是8080:
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
我在这里错过了一些东西吗?
答案 0 :(得分:2)
请注意,之前我遇到过此问题,因为我使用的网络主机阻止了标准80和443(HTTPS)之外的出站端口。所以你可能想问他们或做一般测试。实际上,为了安全起见,一些主机甚至经常在端口80上阻止出站。
答案 1 :(得分:1)
// Use PHP cURL to make a request to port 8080 on a server
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
PHP cURL sending to port 8080
$ch = curl_init();
curl_setopt($ch, CURLOPT_PORT, 8080);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
curl_setopt($ch, CURLOPT_POST, count($data));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$target_response = curl_exec($ch);
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, 'http://somesite.tld:8080');
答案 2 :(得分:0)
您是否尝试通过SSH连接到运行此命令的服务器并验证iptables规则,和/或尝试通过telnet连接到目标服务器?
sh
telnet somesite.tld 8080
如果不出意外,它将有助于解决您的问题并消除网络问题。
答案 3 :(得分:0)
首先检查您是否能够使用PHP的可怕Curl语法之外的其他东西进行连接:
否则看看使用(对于linux用户)
一旦你建立起来就可以连接,那么你就可以开始使用PHP Curl了。有包装,但它们是我发现的片状。
可以非常轻松地将Curl,Wget或类似命令配置为使用GET和POST方法。这是不可取的,但对于使用Curl的多个复杂操作,我只是放弃了尝试正确配置PHP库并简单地删除到命令行。
存在安全隐患。您需要非常小心,确保您提供的任何内容,特别是来自表单或外部来源的内容都被适当地转义。
<?
//Strip out any possible non-alpha-numeric character for security
$stringToSend = preg_replace('[^a-zA-Z]', '', $stringToSend);
$return = shell_exec("curl -X POST -d $stringToSend http://example.com/path/to/resource");
答案 4 :(得分:0)
您的网络服务器配置错误。您提供的代码适合我。
此外,您的代码可以更简单。只需将URI放入init调用中,然后删除CURLOPT_PORT
和CURLOPT_URL
行:
$ch = curl_init('http://somesite.tld:8080');
答案 5 :(得分:0)
您确定要加入的服务器没有防火墙吗? Selinux被禁用了吗?
答案 6 :(得分:0)
你可以使用Maby --local-port [-num]
设置用于连接的本地端口号的首选数量或范围。请注意,端口号本质上是一种稀缺资源,有时会很忙,因此将此范围设置得太窄可能会导致不必要的连接设置失败。 (在7.15.2中添加)
答案 7 :(得分:0)
简单CURL GET
请求:(如果需要,还添加了json / headers,以使您的生活更轻松)
<?php
$chTest = curl_init();
curl_setopt($chTest, CURLOPT_URL, "http://example.com:8080/?query=Hello+World");
curl_setopt($chTest, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Accept: application/json'));
curl_setopt($chTest, CURLOPT_HEADER, true);
curl_setopt($chTest, CURLOPT_RETURNTRANSFER, true);
$curl_res_test = curl_exec($chTest);
$json_res_test = explode("\r\n", $curl_res_test);
$codeTest = curl_getinfo($chTest, CURLINFO_HTTP_CODE);
curl_close($chTest);
?>
示例POST
请求:
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com:8080');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"Hello" : "World", "Foo": "World"}');
// Set timeout to close connection. Just for not waiting long.
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$curl_res = curl_exec($ch);
?>
Charset 不是必需的HTTP标头,其他标头也是如此,重要的是 Content-Type 。
对于我使用JSON MIME类型的示例,您可以使用您想要的任何内容,请查看链接: http://en.wikipedia.org/wiki/Internet_media_type
确保您的php启用了php_curl.dll
扩展程序,并确保目标服务上的端口已打开。
希望这有帮助。
答案 8 :(得分:-1)
为curl尝试此选项
curl_setopt($ch, CURLOPT_PROXY,"localhost:8080");
或使用此
curl_setopt($ch, CURLOPT_PROXY,"yourservername:8080");
答案 9 :(得分:-1)
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "your-domain-name");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch); `
?>