无法使用 $_SERVER 变量卷曲到 PHP 页面
Can't Curl to PHP Page with $_SERVER Variables
对此有点困惑。试图找到一种方法来检测代理及其类型。不确定是否有限制,或者是否需要启用某些选项或什么。
这是上传到我的一个实时网站的 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 文件中。真的很混乱,我什至不确定如何在完全没有响应或错误消息的情况下调试它,让我继续前进。任何人都知道发生了什么或我可以采取什么其他途径来测试它?
您发布的第一个脚本有几个语法错误。当您通过 curl 调用它时,您会收到 HTTP 500 错误,因为它抛出异常。
测试中的一些注意事项:
- 您没有用花括号关闭
foreach
循环。
- 您的一系列嵌套
if
语句缺少大括号。
- 当从命令行 运行 时,
$_SERVER
超全局不会填充所有值(仅供参考,我的测试——不一定是问题)导致几个 undefined index
错误。
单独处理该脚本,一旦它 运行 正确,您就可以从另一个脚本调用它。
对此有点困惑。试图找到一种方法来检测代理及其类型。不确定是否有限制,或者是否需要启用某些选项或什么。
这是上传到我的一个实时网站的 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 文件中。真的很混乱,我什至不确定如何在完全没有响应或错误消息的情况下调试它,让我继续前进。任何人都知道发生了什么或我可以采取什么其他途径来测试它?
您发布的第一个脚本有几个语法错误。当您通过 curl 调用它时,您会收到 HTTP 500 错误,因为它抛出异常。
测试中的一些注意事项:
- 您没有用花括号关闭
foreach
循环。 - 您的一系列嵌套
if
语句缺少大括号。 - 当从命令行 运行 时,
$_SERVER
超全局不会填充所有值(仅供参考,我的测试——不一定是问题)导致几个undefined index
错误。
单独处理该脚本,一旦它 运行 正确,您就可以从另一个脚本调用它。