file_get_contents за проксі?


74

На роботі ми повинні використовувати проксі-сервер для доступу до порту 80, наприклад, у нас є власні власні логіни для кожного користувача.

Моє тимчасове рішення полягає у використанні curl, щоб в основному ввійти в систему як я через проксі-сервер та отримати доступ до зовнішніх даних, які мені потрібні.

Чи є якийсь розширений параметр php, який я можу встановити так, щоб усередині кожного разу, коли він намагається викликати щось подібне, file_get_contents()він завжди проходить через проксі? Я працюю в банкоматі Windows, тому було б важко перекомпілювати, якщо це єдиний спосіб.

Причина мого тимчасового рішення полягає в тому, що мені потрібне загальне рішення, яке працює для кількох користувачів, замість того, щоб використовувати облікові дані одного користувача (я розглядав запит на окремий обліковий запис користувача виключно для цього, але паролі часто змінюються, і ця техніка повинна бути розгорнута протягом десяток і більше сайтів). Я не хочу жорстко кодувати облікові дані, в основному, щоб використовувати обхідний шлях для завивки.

Відповіді:


173

Для використання 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 .

Тепер ви передаєте проксі- сервер заголовку проксі-авторизації , що містить ваші логін та пароль.

І ... Сторінка повинна відображатися ;-)


Мартіне, у мене є файл автоконфігурації проксі (pac) замість одного проксі-сервера. Також для цього потрібна автентифікація NTLM. Чи можете ви допомогти мені тут?
codeomnitrix

Я отримую таку помилку: не вдалося відкрити потік: Не вдалося знайти сокет-транспорт "http" - чи забули ви його ввімкнути під час налаштування PHP? Я використовую PHP5.5 / Apache2.4 з увімкненим curl.
Tuan Anh Hoang-Vu

Дуже дякую. Зазвичай cURL мене задовольняє, але я експериментую з Appengine PHP і не маю laode cURL, тому file_get_content із контекстом потоку мене врятував: D
m3nda

@codeomnitrix, можливо, трохи пізно, але у мене була та сама проблема, і я вставив URL-адресу файлу pac у браузер, і у файлі я міг знайти IP-адресу проксі-сервера.
Martin Lietz

Для кого завгодно: у моєму випадку це також потрібно було використовувати tcpяк протокол. До того, як я використав httpте, що дало мені помилку: не вдалося відкрити потік: Не вдалося знайти сокет-транспорт "http" - ви забули його ввімкнути, коли налаштовували PHP?
Робш

23

Використовуйте stream_context_set_defaultфункцію. Це набагато простіше у використанні, оскільки ви можете безпосередньо використовувати file_get_contents або подібні функції, не передаючи ніяких додаткових параметрів

Цей допис у блозі пояснює, як ним користуватися. Ось код із цієї сторінки.

<?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);
?>

2

Залежно від того, як працює вхід через проксі, stream_context_set_default може вам допомогти.

$context  = stream_context_set_default(
  array(
    'http'=>array(
      'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
    )
  )
);
$result = file_get_contents('http://..../...');

1

Тут є подібний допис: http://techpad.co.uk/content.php?sid=137, де пояснюється, як це зробити.

function file_get_contents_proxy($url,$proxy){

    // Create context stream
    $context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
    $context = stream_context_create($context_array);

    // Use context stream with file_get_contents
    $data = file_get_contents($url,false,$context);

    // Return data via proxy
    return $data;

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.