file_get_contents代理后面?

2022-08-30 08:29:19

在工作中,我们必须使用代理来访问端口80,例如,我们为每个用户都有自己的自定义登录名。

我的临时解决方法是使用curl基本上通过代理以我自己的身份登录并访问我需要的外部数据。

有没有某种高级php设置,我可以设置,以便在内部尝试调用类似的东西时,它总是通过代理?我在Windows ATM上,所以如果这是唯一的方法,那么重新编译会很痛苦。file_get_contents()

我的解决方法是临时的,因为我需要一个通用的解决方案,适用于多个用户,而不是使用一个用户的凭据(我考虑过请求一个单独的用户帐户只是为了做到这一点,但密码经常更改,这种技术需要在整个十几个或更多的站点中部署)。我不想将凭据硬编码为基本使用 curl 解决方法。


答案 1

要通过/通过不需要身份验证的代理使用file_get_contents(),应该这样做:

(我无法测试这个:我的代理需要身份验证)

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

当然,将我的代理的IP和端口替换为那些适合您的代理;-)

如果您收到此类错误:

Warning: file_get_contents(http://www.google.com) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 407 Proxy Authentication Required

这意味着您的代理需要身份验证。

如果代理需要身份验证,则必须添加几行,如下所示:

$auth = base64_encode('LOGIN:PASSWORD');

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
        'header'          => "Proxy-Authorization: Basic $auth",
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;

关于IP和端口也是如此,这次也是登录名和密码;-)查看所有有效的 http 选项

现在,您正在将代理授权标头传递给代理,其中包含您的登录名和密码。

和。。。页面应该显示;-)


答案 2

使用功能。它更易于使用,因为您可以直接使用file_get_contents或类似函数,而无需传递任何其他参数stream_context_set_default

这篇博客文章解释了如何使用它。下面是该页面中的代码。

<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
  'http' => array(
   'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Remove the 'header' option if proxy authentication is not required
  )
 )
);

$url = "http://www.pirob.com/";

print_r( get_headers($url) );

echo file_get_contents($url);
?>

推荐