Немного запутался по этому поводу. Попытка найти способ обнаружения прокси и их тип. Не уверен, есть ли какие-то ограничения, нужно ли включить какую-либо опцию или что.
Вот скрипт php, загруженный на один из моих живых сайтов
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description">
<meta name="author">
<link rel="stylesheet" href="css/styles.css?v=1.0">
</head>
<body>
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
set_time_limit(6000);
function get_ip()
{
if ($_SERVER)
{
if ($_SERVER['HTTP_X_FORWARDED_FOR']) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
elseif ($_SERVER['HTTP_CLIENT_IP']) $ip = $_SERVER['HTTP_CLIENT_IP'];
else $ip = $_SERVER['REMOTE_ADDR'];
}
else
{
if (getenv('HTTP_X_FORWARDED_FOR')) $ip = getenv('HTTP_X_FORWARDED_FOR');
elseif (getenv('HTTP_CLIENT_IP')) $ip = getenv('HTTP_CLIENT_IP');
else $ip = getenv('REMOTE_ADDR');
}
return $ip;
}
function detect_proxy($myIP)
{
$scan_headers = array(
'HTTP_VIA',
'HTTP_X_FORWARDED_FOR',
'HTTP_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED_FOR_IP',
'VIA',
'X_FORWARDED_FOR',
'FORWARDED_FOR',
'X_FORWARDED',
'FORWARDED',
'CLIENT_IP',
'FORWARDED_FOR_IP',
'HTTP_PROXY_CONNECTION'
);
$flagProxy = false;
$libProxy = 'No';
foreach($scan_headers as $i) {
if ($_SERVER[$i]) { $flagProxy = true; }
if (in_array($_SERVER['REMOTE_PORT'], array(
8080,
80,
6588,
8000,
3128,
553,
554) || @fsockopen($_SERVER['REMOTE_ADDR'], 80, $errno, $errstr, 30)))
{ $flagProxy = true; }
if ($flagProxy == true && isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
// HTTP_X_FORWARDED_FOR = yourIP
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $myIP) { $libProxy = 'Transparent'; }
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $_SERVER['REMOTE_ADDR']) { $libProxy = 'Simple';
elseif ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != $_SERVER['REMOTE_ADDR'] ) { $libProxy = 'Distorting';
elseif ( $_SERVER['HTTP_X_FORWARDED_FOR'] == '' && $_SERVER['HTTP_CLIENT_IP'] == '' && !empty($_SERVER['HTTP_VIA']) ) { $libProxy = 'Anonymous';
else { $libProxy = 'High'; }
}
return $libProxy;
}
$ip = get_ip();
echo 'Proxy Server Detection<br />';
echo '=================<br /><br />';
$typeProxy = detect_proxy($ip);
echo 'Use Proxy Server : ' . $typeProxy . '<br />';
echo '<br />';
echo 'Brief IP Information' . '<br />';
echo '--------------------' . '<br />';
echo 'Your IP : ' . $ip . '<br />';
echo 'Language : ' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '<br />';
echo '<br />';
echo 'Detail IP Information' . '<br />';
echo '---------------------' . '<br />';
echo 'HTTP_ACCEPT : ' . $_SERVER['HTTP_ACCEPT'] . '<br />';
echo 'HTTP_ACCEPT_ENCODING : ' . $_SERVER['HTTP_ACCEPT_ENCODING'] . '<br />';
echo 'HTTP_ACCEPT_LANGUAGE : ' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . '<br />';
echo 'HTTP_ACCEPT_CHARSET : ' . $_SERVER['HTTP_ACCEPT_CHARSET'] . '<br />';
echo 'HTTP_CONNECTION : ' . $_SERVER['HTTP_CONNECTION'] . '<br />';
echo 'HTTP_HOST : ' . $_SERVER['HTTP_HOST'] . '<br />';
echo 'HTTP_KEEP_ALIVE : ' . $_SERVER['HTTP_KEEP_ALIVE'] . '<br />';
echo 'HTTP_USER_AGENT : ' . $_SERVER['HTTP_USER_AGENT'] . '<br />';
echo 'REMOTE_HOST : ' . @gethostbyaddr($_SERVER['REMOTE_ADDR']) . '<br />';
echo 'REMOTE_PORT : ' . $_SERVER['REMOTE_PORT'] . '<br />';
echo '<br />';
echo 'REMOTE_ADDR : ' . $_SERVER['REMOTE_ADDR'] . '<br />';
echo 'HTTP_VIA : ' . $_SERVER['HTTP_VIA'] . '<br />';
echo 'HTTP_X_FORWARDED_FOR : ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . '<br />';
echo 'HTTP_PROXY_CONNECTION : ' . $_SERVER['HTTP_PROXY_CONNECTION'] . '<br />';
echo 'HTTP_CLIENT_IP : ' . $_SERVER['HTTP_CLIENT_IP'] . '<br />';
?>
</body>
</html>
вместе со сценарием, который я пробовал как на моем локальном хосте, так и на другом отдельном веб-сервере
$url = 'https://www.othersite.com/test.php';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_USERAGENT, $useragent);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.9',
'Cache-Control: max-age=0',
'Connection: keep-alive'
));
$curl_page = curl_exec($curl);
$err = curl_errno ( $curl );
$errmsg = curl_error ( $curl );
$header = curl_getinfo ( $curl );
$httpCode = curl_getinfo ( $curl, CURLINFO_HTTP_CODE );
echo '------------------------';
echo '<pre>';
print_r($curl);
echo '</pre>';
echo '<pre>';
print_r($err);
echo '</pre>';
echo '<pre>';
print_r($errmsg);
echo '</pre>';
echo '<pre>';
print_r($header);
echo '</pre>';
echo '<pre>';
print_r($httpCode);
echo '</pre>';
if(curl_exec($curl) === false)
{
echo 'Curl error: ' . curl_error($curl);
}
echo '<h1>Response</h1>';
echo '<pre>';
print_r(curl_getinfo($curl));
echo '</pre>';
echo 'page:';
echo $curl_scraped_page;
var_dump($curl_scraped_page);
И это результат>
Response
Array
(
[url] => https://www.othersite.com/test.php
[content_type] => text/html; charset=UTF-8
[http_code] => 500
[header_size] => 213
[request_size] => 323
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.14
[namelookup_time] => 1.0E-6
[connect_time] => 0.046
[pretransfer_time] => 0.093
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => -1
[starttransfer_time] => 0.14
[redirect_time] => 0
[redirect_url] =>
[primary_ip] => 148.72.12.211
[certinfo] => Array
(
)
[primary_port] => 443
[local_ip] => 10.150.43.44
[local_port] => 51212
)
page:
C:\wamp64\www\testext.php:111:string '' (length=0)
Так что по какой-то причине много ничего. Даже не echo’d html, находящийся в файле php. Действительно сбивает с толку, и я даже не уверен, как отладить его без каких-либо ответов или сообщений об ошибках для меня, чтобы продолжить. Кто-нибудь знает, что происходит или каким другим путем я могу пойти, чтобы проверить это?
Первый опубликованный вами скрипт имеет несколько синтаксических ошибок. Когда вы звоните через локон, вы получаете ошибку HTTP 500, потому что она вызывает исключения.
Несколько замечаний по тестированию:
foreach
петля с фигурной скобкой.if
В утверждениях отсутствуют фигурные скобки.$_SERVER
superglobal не будет заполнен всеми значениями при запуске из командной строки (только из моего тестирования, но это не обязательно проблема), что приведет к нескольким undefined index
ошибки.Работайте над этим сценарием отдельно и, как только он запустится правильно, вы можете вызвать его из другого.
Других решений пока нет …