5

我正在从一个网站(比如 x.com)获取我的应用程序的数据。我使用 php 函数 file_get_contents() 来获取数据。可以肯定的是,我的服务器的 ip 地址将显示在 x.com 的日志中。有没有办法在不使用代理的情况下隐藏我的服务器的 IP?

如果我有代理,如何将它与 file_get_contents() 一起使用

我需要在 HTTP POST 和 HTTP GET 方法中发送请求

4

2 回答 2

24

test.php 使用http://ifconfig.me/ip

http://www.php.net/manual/en/function.file-get-contents.php修改的代码

<?php

// Create a stream
$opts = array(
        'http'=>array(
            'method'=>"GET",
            'header'=>"Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n",
            'proxy' => 'tcp://221.176.14.72:80',
            )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://ifconfig.me/ip', false, $context);

var_dump($file);
于 2013-01-26T08:46:50.237 回答
1

绝对同意farmer1992。

对于任何file_get_contents对 SSL + 代理有问题的人,PHP 的 stream_context_create 存在一个已知错误:

https://bugs.php.net/bug.php?id=63519

幸运的是,解决方法很简单。基本上,上下文创建者在将“https”目标 URL 解析为代理和 SSL 配置时会感到困惑。您只需在 SSL 配置中设置SNI_server_name :

$targetUrl = "https://something.com";
$sniServer = parse_url($targetUrl, PHP_URL_HOST);
$params = array('your'=>'post','params'=>'here');
$ctxConfig = array(
    'http' => array(
        'method' => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded'."\r\n",
        'content' => http_build_query($params),
        'proxy' => 'tcp://12.34.56.78:3128',
        'request_fulluri' => true
    ),
    'ssl' => array( 
        'SNI_enabled' => true,
        'SNI_server_name' => $sniServer
    )
);
$context = stream_context_create($ctxConfig);
file_get_contents($targetUrl,false,$context)

希望这可以节省一些时间!

于 2015-03-24T23:31:40.893 回答